2012-02-23 4 views
1

У меня есть какая-то проблема здесь,PHP DomDocument, Unicode проблемы

$source = "<html><body><h1>&#8220;</h1></body></html>"; 
$dom = new DOMDocument(); 
$dom->loadHTML($source); 
echo $dom->saveHTML(); 

Выход:

< DOCTYPE HTML PUBLIC " - // W3C // DTD HTML 4.0 Transitional // EN " " HTTP : //www.w3.org/TR/REC-html40/loose.dtd " > < <HTML> > тело <h1> & ldquo; </h1 > </тело > </html >

Хорошо, эта работа правильно. Но если я хочу, чтобы извлечь узлы, как этот

$source = "<html><body><h1>&#8220;</h1></body></html>"; 
$dom = new DOMDocument(); 
$dom->loadHTML($source); 
$h1 = $dom->getElementsByTagName('h1'); 
echo $dom->saveHTML($h1->item(0)); 

Это выходной непризнанного текст.

<h1> â € œ </h1 >

Кто знает, как решить эту проблему?

+1

Все эти функции DOM возвращают закодированные строки UTF-8, лучше проверьте руководство. Нечего решать, а просто правильно отображать, например. сообщите своему браузеру, правильно настроив заголовки ответов или используя меню в своем браузере, где вы можете указать кодировку кодировки, если вы не знаете, как автоматически указывать браузер. См. Http://www.webstandards.org/learn/articles/askw3c/dec2002/ – hakre

ответ

2

Ваш пример кода работает для меня, выход <h1>“</h1>.

&ldquo; <ENTITY TYPE="#8220"/> “ Left double quotation mark 

Binary UTF-8 последовательность является:

0xE2 (226) 0x80 (128) 0x9C (156) 
|   |   `------ Windows-1252: œ 
|   `--- most Windows 125x encodings: € 
`--- ISO 8859-1, 2, 3, 4, 9, 10, 14, 15, 16: â 

Так где же вы смотрите, что выход?

Возможно, в вашем браузере на окнах? Если в вашем браузере вы пытались добавить

header('Content-Type: text/html; charset=utf-8'); 

поверх вашего скрипта?

См. Также: Setting the HTTP charset parameter и Checking HTTP Headers.

+0

Да, это работает. Спасибо. – haohan

+0

Это может быть дефект с помощью ['saveHTML'] (http://php.net/manual/en/domdocument.savehtml.php) и использование параметра' $ node' (не используя сущности, а 'saveHTML' w/o '$ node' делает). – hakre

0

вам нужна второй параметр DomDocument конструктора (проверка http://nl.php.net/manual/en/domdocument.construct.php):

$dom = new DOMDocument('1.0', 'utf-8'); 
+0

Нет, вам не нужно. – hakre

+1

источник HTML, который я использовал для загрузки уже закодированного, “. Он корректно выводится, когда $ dom-> saveHTML(), но выводится в неизвестный юникод, если я печатаю выбранные узлы, $ dom-> saveHTML ($ nodes); – haohan

Смежные вопросы