2

如果我使用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");
}
4

2 回答 2

4

在您上次调用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。不幸的是,检测算法并不总是能很好地工作。

例如,虽然您的示例页面设置了字符集元标记,但loadHTML无法识别该元标记,因此默认假定源编码为 Latin1。如果您使用了指定Content-Type的http-equiv元标记,它会起作用。

<meta http-equiv="Content-Type" content="text/html; charset=gbk" />

另一种方法是完全避免该问题,但通过将所有非 ASCII 字符转换为 html 实体(如您所做的那样)。这样,loadHTML是否正确检测到字符编码并不重要,因为不会有任何字符需要转换。

于 2013-07-26T22:41:12.267 回答
2

由于您已经将文档转换为 html 实体,因此在打印结果时无需转换编码。所以:

echo $e->nodeValue;
// echo mb_convert_encoding($e->nodeValue,"utf-8","gbk");

你没有得到正确输出的原因是你<meta charset="gbk"/>在你的 html 应该是<meta charset="utf-8"/>.

于 2013-07-26T09:41:01.233 回答