如果我使用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");
}发布于 2013-07-27 06:41:12
在最后一次调用时,您的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时,它会尝试检测源编码,然后将输入从该编码转换为UTF8。不幸的是,检测算法并不总是工作得很好。
例如,尽管您的示例页面设置了字符集元标记,但loadHTML无法识别该元标记,因此它默认假设源编码为Latin1。如果您使用http-equiv metatag指定Content-Type,那么它就可以工作。
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />另一种方法是完全避免这个问题,而是将所有非ASCII字符转换为html实体(就像您所做的那样)。这样,loadHTML是否正确地检测到字符编码并不重要,因为不会有任何需要转换的字符。
发布于 2013-07-26 17:41:01
因为您已经将文档转换为html实体,所以在打印结果时不需要转换编码。所以:
echo $e->nodeValue;
// echo mb_convert_encoding($e->nodeValue,"utf-8","gbk");你没有得到正确输出的原因是你在你的html中放入了<meta charset="gbk"/>,而它应该是<meta charset="utf-8"/>。
https://stackoverflow.com/questions/17824654
复制相似问题