В проекте Symfony у меня есть что-то вроде этого:
$crawler = new Crawler($this->bigString());
$array = array();
foreach($crawler->filter('.editable') as $domElement )
{
$innerHtml = $this->getChildHtml($domElement);
$array[$domElement->getAttribute('id')] = $innerHtml;
$domElement->nodeValue = '{{ listEditables["' . $domElement->getAttribute('id') . '"] }}';
$crawler->addNode($domElement);
}
$page->setEditables($array);
$em->persist($page);
$em->flush();
Где возвращает метод bigString
<div class="info pmt0 wrap">
<p id="p_editable_2" class="editable">所谓设计,创于人,且用于人......</p>
... a bunch of other html element with Chinese in it ...
</div>
и я использую
private function getChildHtml($node)
{
$innerHtml= '';
$children = $node->childNodes;
foreach( $children as $child )
{
$innerHtml .= sprintf( '%s%s', $innerHtml, $child->ownerDocument->saveXML( $child ) );
}
return $innerHtml;
}
чтобы получить внутренний HTML.
Я не могу заставить сохраненные элементы точно представлять китайские иероглифы, все, что я получаю, — это чепуха. С использованием
var_dump($innerHtml);
показывает, что getChildHtml() не возвращает исходные китайские символы. Любая идея, как я могу заставить это сделать это?
Согласно этому вопросу,
sprintf
вам не поможет. Вместо этого используйте что-то вроде mb_substr().Кроме этого, скорее всего, правильная кодировка Вам помогут.
mb_substr не помогает. Я знаю, что это проблема с кодировкой, но я не знаю, как ее решить. — person Afunakwa; 19.08.2017
Что ж, убедитесь, что все файлы закодированы в кодировке utf8, и установите ее вручную в файле php. — person Afunakwa; 19.08.2017
В php.ini utf-8 имеет кодировку по умолчанию, но ничего не меняет — person Afunakwa; 19.08.2017
Затем проверьте saveXML(). Кажется, это следующий кандидат. — person Afunakwa; 19.08.2017
Да, это виновник. — person Afunakwa; 19.08.2017
Оказывается, проблема была с Symfony Crawler.
Как указано здесь, хорошим обходным путем является запись
вместо
так как метод addHtmlContent по умолчанию кодируется в UTF8