2012-02-23 73 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