如果我使用 echo $doc->saveHTML();
它会相应地显示字符,但是一旦它到达 xml?在 xpath 中提取元素,问题又回来了。
我似乎无法正确显示字符。我如何正确转换它。我得到:
婢跺繐顒滈拺鍙ョ瀵偓鐞涱偊鈧繑妲戦挅鍕綍婢舵牕顨� 闂€鍌溾敄缂侊綀濮虫稉濠呫€� 娑擃叀顣荤純鎴犵綍閺冭泛鐨绘總鍏呯瑐鐞涳綀鏉藉▎
而不是正确的中文:
<head><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta charset="gbk"/></head>
我的 PHP 代码:
$html = file_get_contents('http://item.taobao.com/item.htm?spm=a2106.m874.1000384.41.aG3Kbi&id=20811635147&_u=o1ffj7oi9ad3&scm=1029.newlist-0.1.16&ppath=&sku=');
$doc = new DOMDocument();
// Based on Article http://stackoverflow.com/questions/11309194/php-domdocument-failing-to-handle-utf-8-characters/11310258#11310258
$searchPage = mb_convert_encoding($html,"HTML-ENTITIES","GBK");
$doc->loadHTML($searchPage);
// echo $doc->saveHTML();
$xpath = new DOMXpath($doc);
$elements = $xpath->query("//*[@id='detail']/div[1]/h3");
foreach ($elements as $e) {
//echo $e->nodeValue;
echo mb_convert_encoding($e->nodeValue,"utf-8","gbk");
}
最佳答案
在上次调用 mb_convert_encoding 时,您的 to_encoding 和 from_encoding 参数用错了.从 XPath 查询返回的内容被编码为 UTF-8,但您假定输出编码为 gbk(假定您已将元字符集设置为“gbk”)。
所以最后的循环应该是:
foreach ($elements as $e) {
echo mb_convert_encoding($e->nodeValue,"gbk","utf-8");
}
to_encoding 是“gbk”,from_encoding 是“utf-8”。
也就是说,如果您对页面编码为 UTF-8 感到满意,AgreeOrNot 给出的答案也应该有效。
至于编码过程的工作原理,DOMDocument 在内部使用 UTF-8,所以这就是为什么您从 xpath 查询中获得的结果是 UTF-8,以及为什么您需要将其转换如果这是您需要的字符集,则使用 mb_convert_encoding 转换为 gbk。
当您调用 loadHTML 时,它会尝试检测源编码,然后将输入从该编码转换为 UTF-8。不幸的是,检测算法并不总是能很好地工作。
例如,虽然您的示例页面设置了 charset 元标记,但 loadHTML 无法识别该元标记,因此它默认假定源编码为 Latin1。如果您使用 http-equiv 元标记指定 Content-Type,它就会起作用。
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
另一种方法是完全避免该问题,但将所有非 ASCII 字符转换为 html 实体(正如您所做的那样)。这样一来,loadHTML 是否正确检测到字符编码并不重要,因为不会有任何字符需要转换。
关于xpath 后的 PHP DomXPath 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824654/