$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
或类似的东西做任何事情,请注意这一点。