带有 XPath 编码问题的 DOMDocument.[?]很多测试


DOMDocument with XPath Encoding problems. [?] A lot of tests

$msg = "<body><a>áéíóú☻♥♦♣</a></body>";
$temp_dom = new DOMDocument();    
$temp_dom->loadHTML($msg);    
$dom_xpath = new DOMXpath($temp_dom);   
$ele = $dom_xpath->query('//a')->item(0);
echo "<pre>";
echo "Original: $msg'n";
echo $ele->nodeValue;     
echo "</pre>";

输出:

Original: áéíóú☻♥♦♣
áéíóúâ»â¥â¦â£

当前文档编码为 utf-8。我也尝试了ANSI,但发生了同样的问题。

utf8_decode解决问题

echo utf8_decode($ele->nodeValue);

但问题是,我使用了很多属性和很多函数,我必须在每个属性和函数中使用utf8_decode,我相信这不是正确的做法。有人知道我该怎么做吗?

请在发布结果之前使用此测试并对其进行测试,因为我已经尝试了很多东西。

提前非常感谢你。

问题是你需要告诉 DOMDocument 在解析 HTML 时编码是什么。 您无法通过设置 encoding 选项来执行此操作。(我相信这会影响文档的输出方式 saveHTML

执行此操作的略显黑客的方法是将编码语句插入到文档中。 您只需在要解析的 HTML 之前插入'<?xml encoding="UTF-8">'即可完成此操作。

<?php
$msg = "<body><a>áéíóú☻♥♦♣</a></body>";
$temp_dom = new DOMDocument();    

$temp_dom->loadHTML('<?xml encoding="UTF-8">' . $msg);    
$temp_dom->encoding = 'UTF-8';
$dom_xpath = new DOMXpath($temp_dom);   
$ele = $dom_xpath->query('//a')->item(0);
echo "<pre>";
echo "Original: $msg'n";
echo $ele->nodeValue;     
echo "</pre>";

输出:

<pre>Original: <body><a>áéíóú☻♥♦♣</a></body>
áéíóú☻♥♦♣</pre>

但是请注意,这确实会插入一个额外的节点作为文档对象的子节点(准确地说是DOMProcessingInstruction(,因此如果您使用 $temp_dom->childNodes 或类似的东西做任何事情,请注意这一点。