首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xpath之后的DomXPath编码问题

问xpath之后的DomXPath编码问题
EN

Stack Overflow用户
提问于 2013-07-24 11:21:10
回答 2查看 2K关注 0票数 2

如果我使用echo $doc->saveHTML();,它会相应地显示字符,但是一旦它到达xml?在xpath提取元素时,问题又回来了。

我似乎不能正确地显示字符。如何正确地转换它。我得到了:

代码语言:javascript
复制
婢跺繐顒滈拺鍙ョ瀵偓鐞涱偊鈧繑妲戦挅鍕綍婢舵牕顨� 闂€鍌溾敄缂侊綀濮虫稉濠呫€� 娑擃叀顣荤純鎴犵綍閺冭泛鐨绘總鍏呯瑐鐞涳綀鏉藉▎

而不是真正的中文:

代码语言:javascript
复制
<head><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta charset="gbk"/></head>

我的PHP代码:

代码语言:javascript
复制
$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");
}
EN

回答 2

Stack Overflow用户

发布于 2013-07-27 06:41:12

在最后一次调用时,您的to_encoding和from_encoding参数是错误的。从XPath查询返回的内容被编码为UTF-8,但是假设您希望将输出编码为gbk (假设您已经将元字符集设置为"gbk")。

所以最后一个循环应该是:

代码语言:javascript
复制
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时,它会尝试检测源编码,然后将输入从该编码转换为UTF8。不幸的是,检测算法并不总是工作得很好。

例如,尽管您的示例页面设置了字符集元标记,但loadHTML无法识别该元标记,因此它默认假设源编码为Latin1。如果您使用http-equiv metatag指定Content-Type,那么它就可以工作。

代码语言:javascript
复制
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />

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

票数 4
EN

Stack Overflow用户

发布于 2013-07-26 17:41:01

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

代码语言:javascript
复制
echo $e->nodeValue;
// echo mb_convert_encoding($e->nodeValue,"utf-8","gbk");

你没有得到正确输出的原因是你在你的html中放入了<meta charset="gbk"/>,而它应该是<meta charset="utf-8"/>。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17824654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档