Как заставить XPath использовать UTF8?

У меня есть XHTML-документ, который передается в приложение PHP через Greasemonkey AJAX. Приложение PHP использует UTF8. Если я вывожу содержимое POST прямо в текстовое поле в приемном div AJAX, все все еще правильно закодировано в UTF8.

Когда я пытаюсь разобрать с помощью XPath

$dom = new DOMDocument(); $dom->loadHTML($raw2); $xpath = new DOMXPath($dom); $query = '//td/text()'; $nodes = $xpath->query($query); foreach($nodes as $node) { var_dump($node->wholeText); } 

сбрасываемые строки не являются utf8. Как заставить DOM / XPath использовать UTF8?

Если это полноценный действительный документ xhtml, вы не должны использовать loadhtml (), но load () / loadxml ().

Учитывая пример документа xhtml

 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>xhtml test</title> </head> <body> <h1>A Table</h1> <table> <tr><th>A</th><th>O</th><th>U</th></tr> <tr><td>Ä</td><td>Ö</td><td>Ü</td></tr> <tr><td>ä</td><td>ö</td><td>ü</td></tr> </table> </body> </html> 

сценарий

 <?php $raw2 = 'test.html'; $dom = new DOMDocument(); $dom->load($raw2); $xpath = new DOMXPath($dom); var_dump($xpath->registerNamespace('h', 'http://www.w3.org/1999/xhtml')); $query = '//h:td/text()'; $nodes = $xpath->query($query); foreach($nodes as $node) { foo($node->wholeText); } function foo($s) { for($i=0; $i<strlen($s); $i++) { printf('%02X ', ord($s[$i])); } echo "\n"; } 

печать

 bool(true) C3 84 C3 96 C3 9C C3 A4 C3 B6 C3 BC 

т.е. выходные / строки кодируются utf-8

У меня была та же проблема, и я не мог использовать аккуратно на своем веб-сервере. Я нашел это решение, и он работал нормально:

 $ html = mb_convert_encoding ($ html, «HTML-ENTITIES», «UTF-8»);
 $ dom = новый DomDocument ();
 $ Dom-> loadHTML ($ HTML); 

Я не пробовал, но второй параметр DOMDocument::__construct похоже, связан с кодировкой; возможно, это поможет вам 🙂

Кроме того, в DOMDocument есть свойство кодирования , которое доступно для записи.

DOMXpath построен с параметром DOMDocument как параметр, возможно, он будет работать …

Борясь с аналогичной проблемой (не смог заставить Xpath использовать UTF-8 в сочетании с loadHTML), в конце концов эта замечательная статья предоставила решение: http://devzone.zend.com/article/8855

обходной путь:

Вставьте дополнительный раздел с соответствующим метатетом HTTP-EQUIV Content-type сразу после открытого тега.

Немного поздно в игре, но, возможно, это помогает кому-то …

Проблема может быть в выходе, а не в самом объекте dom / xpath.

Если вы выведете nodeValue напрямую, вы получите поврежденные символы, например:

 ìÂÂì ë¹Â디ì¤ ìì ë¹ë””ì¤ í°ì íì¤ 

Вы должны загрузить свой объект dom со вторым параметром «utf-8», new \DomDocument('1.0', 'utf-8') , но все же, когда вы печатаете список узлов / элементов dom, вы получаете сломанные символы:

echo $contentItem->item($index)->nodeValue

вы должны обернуть его utf8_decode:

echo utf8_decode($contentItem->item($index)->nodeValue) //output: 者不終朝而會,愚者可浹旬而學