PHP DOMDocument,Unicode问题

时间:2012-02-23 14:31:41

标签: php character-encoding domdocument

我在这里有一些问题

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

输出:

  

&lt;!DOCTYPE html PUBLIC“ - // W3C // DTD HTML 4.0 Transitional // EN”“http://www.w3.org/TR/REC-html40/loose.dtd">   &LT; HTML&GT;&LT;主体&GT;&LT; H1&GT;&安培; ldquo;&LT; / H1&GT;&LT; / BODY&GT;&LT; / HTML&GT;

好的,这个工作正常。 但是,如果我想提取像这样的节点

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

输出无法识别的文字。

  

&LT; H1&gt;一种€œ&LT; / H1&GT;

任何人都知道如何解决这个问题?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你需要domdocument构造函数的第二个参数(checkout http://nl.php.net/manual/en/domdocument.construct.php):

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