xpath 后的 PHP DomXPath 编码问题

标签 php html dom xpath

如果我使用 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_encodingfrom_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/

相关文章:

php - 如何在 Imagick 中设置图像像素颜色?

php - 检查所选行中列的所有值

JavaScript 拒绝工作?

image - 如何使我网页中的图像无法下载

javascript - 如何高效地创建和附加多个 dom 元素

javascript - javascript触发对话框打开时如何使IE8/9提交输入类型="file"

html5搜索输入事件

php - WordPress 博客文章重定向(1000 篇文章)

php - Android读取从php返回的数组

html - 是否可以使用 CSS 在 SVG 元素上设置背景图像?