我有被传递到通过Greasemonkey的AJAX一个PHP应用程序的XHTML文档。 PHP的应用程序使用UTF8。 如果我输出的帖子内容直接回到了在AJAX一个textarea接收DIV,一切仍是正确编码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?
如果它是一个完全成熟有效的XHTML文档,你不应该使用loadhtml(),但负载()/ 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编码
我有同样的问题,在我的web服务器我无法用整洁。 我发现这个解决方案,它工作得很好:
$html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");
$dom = new DomDocument();
$dom->loadHTML($html);
我还没有尝试过,但第二个参数DOMDocument::__construct
似乎与编码; 也许这会帮助你:-)
否则,有一个在DOM文档编码属性 ,这是可写的。
该DOMXpath beeing与DOM文档构建为参数,也许它会工作...
有点在游戏后期,但也许它可以帮助别人...
这个问题可能是在输出中,而不是在DOM / XPath对象本身。
如果你想输出的nodeValue直接,你会得到乱码,例如:
ìÂÂì ë¹Â디ì¤
ìì ë¹ë””ì¤ í°ì íì¤
你必须与第二参数去加载DOM对象“UTF-8”, new \DomDocument('1.0', 'utf-8')
但仍当你打印DOM节点列表/元素值你破字:
echo $contentItem->item($index)->nodeValue
你有utf8_decode包裹起来:
echo utf8_decode($contentItem->item($index)->nodeValue) //output: 者不終朝而會,愚者可浹旬而學
用类似的问题挣扎(无法强制的Xpath与loadHTML组合使用UTF-8),在此端优秀的文章提供的解决方案: http://devzone.zend.com/article/8855
解决方法:
插入用适当的内容类型HTTP-EQUIV元标记立即开始标记以下的附加部分。