我有一个XHTML文档通过Greasemonkey AJAX传递给PHP应用程序。 PHP应用程序使用UTF8。如果我将POST内容直接输回到AJAX接收div中的textarea,则所有内容仍然以UTF8正确编码。
当我尝试使用XPath解析时
$dom = new DOMDocument();
$dom->loadHTML($raw2);
$xpath = new DOMXPath($dom);
$query = '//td/text()';
$nodes = $xpath->query($query);
foreach($nodes as $node) {
var_dump($node->wholeText);
}
转储字符串不是utf8。如何强制DOM / XPath使用UTF8?
答案 0 :(得分:30)
我有同样的问题,我无法在我的网络服务器中使用整洁。 我找到了这个解决方案并且工作正常:
$html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"); $dom = new DomDocument(); $dom->loadHTML($html);
答案 1 :(得分:3)
如果它是一个完全成熟的有效xhtml文档,你不应该使用loadhtml()而是load()/ loadxml()。
给出示例xhtml文档
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>xhtml test</title>
</head>
<body>
<h1>A Table</h1>
<table>
<tr><th>A</th><th>O</th><th>U</th></tr>
<tr><td>Ä</td><td>Ö</td><td>Ü</td></tr>
<tr><td>ä</td><td>ö</td><td>ü</td></tr>
</table>
</body>
</html>
脚本
<?php
$raw2 = 'test.html';
$dom = new DOMDocument();
$dom->load($raw2);
$xpath = new DOMXPath($dom);
var_dump($xpath->registerNamespace('h', 'http://www.w3.org/1999/xhtml'));
$query = '//h:td/text()';
$nodes = $xpath->query($query);
foreach($nodes as $node) {
foo($node->wholeText);
}
function foo($s) {
for($i=0; $i<strlen($s); $i++) {
printf('%02X ', ord($s[$i]));
}
echo "\n";
}
打印
bool(true)
C3 84
C3 96
C3 9C
C3 A4
C3 B6
C3 BC
即。输出/字符串是utf-8编码的
答案 2 :(得分:1)
我没试过,但DOMDocument::__construct
的第二个参数似乎与编码有关;也许那会对你有所帮助: - )
否则,有encoding property in DOMDocument,这是可写的。
使用DOMDocument作为参数构造的DOMXpath函数,也许它可以工作......
答案 3 :(得分:1)
比赛有点晚,但也许有人帮助......
问题可能出在输出中,而不是dom / xpath对象本身。
如果您直接输出nodeValue,您将收到损坏的字符,例如:
ìÂÂì ë¹Â디ì¤
ìì ë¹ë””ì¤ í°ì íì¤
你必须使用第二个param&#34; utf-8&#34;,new \DomDocument('1.0', 'utf-8')
加载你的dom对象,但是当你打印dom节点列表/元素值时,你会得到破碎的字符:
echo $contentItem->item($index)->nodeValue
你必须用utf8_decode包装它:
echo utf8_decode($contentItem->item($index)->nodeValue)
//output: 者不終朝而會,愚者可浹旬而學
答案 4 :(得分:0)
遇到类似问题(无法强制Xpath将UTF-8与loadHTML结合使用),最后这篇优秀的文章提供了解决方案: http://devzone.zend.com/article/8855
的解决方法:
插入其他部分 使用适当的Content-type HTTP-EQUIV元标记立即生效 按照开头标记。