2012-02-23 69 views
1

我這裏有一些問題PHP DOM文檔,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過渡// EN " " HTTP ://www.w3.org/TR/REC-html40/loose.dtd " > <html> <body> <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 2012-02-23 14:37:04

回答

2

你的代碼示例工作對我來說,輸出爲<h1>「</h1>

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

二進制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: â 

所以,你在哪裏查看輸出?

可能在Windows的瀏覽器中?如果您的瀏覽器內部,您是否嘗試添加

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

在腳本的頂部?

另見:Setting the HTTP charset parameterChecking HTTP Headers

+0

是的,它的工作原理。謝謝。 – haohan 2012-02-23 15:09:06

+0

這可能是['saveHTML'](http://php.net/manual/en/domdocument.savehtml.php)並使用'$ node'參數(不使用實體,而是'saveHTML' w/o '$ node'確實)。 – hakre 2012-02-23 15:35:41

0

你需要DOM文檔構造函數的第二個參數(結帳http://nl.php.net/manual/en/domdocument.construct.php):

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

不,你不需要。 – hakre 2012-02-23 14:37:39

+1

我用來加載已編碼的HTML源代碼,“。它在$ dom-> saveHTML()時正確輸出,但是如果我打印選定的節點$ dom-> saveHTML($ nodes),它會輸出到未知的unicode。 – haohan 2012-02-23 14:42:30