У меня есть 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: 者不終朝而會,愚者可浹旬而學