2009-07-20 52 views
5

我有一个通过Greasemonkey AJAX传递给PHP应用程序的XHTML文档。 PHP应用程序使用UTF8。如果我将POST内容直接输出到AJAX接收div中的textarea,则所有内容仍然以UTF8正确编码。如何强制XPath使用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

你可以提供一个(测试)例如HTML文档ument? – VolkerK 2009-07-20 17:45:46

回答

3

如果是一个成熟有效的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编码

+0

我解析的页面没有。使用Tidy添加,我的问题解决了。 – Grod 2009-07-20 19:21:55

+0

这是正确的。我坚持强烈的意见(弱):如果它声称是xhtml,不要试图修复它;他们想要前面的x,他们必须交付。 ;-) – VolkerK 2014-11-25 10:39:20

1

我还没试过,但DOMDocument::__construct的第二个参数似乎与编码有关;也许这会帮助你:-)

否则,有一个encoding property in DOMDocument,它是可写的。

的DOMXpath beeing与DOM文档构建为参数,也许它会工作...

+0

`$ dom-> encoding ='utf8'`没有效果,也没有在`__construct()`中设置编码。可能由于使用`loadHTML()`,但我不知道。 – Grod 2009-07-22 15:08:31

+0

loadHTML()覆盖构造函数中设置的编码 – leticia 2012-11-21 21:46:46

0

与simil挣扎AR问题(无法强制的Xpath与loadHTML组合使用UTF-8),在结束本优秀的文章提供的解决方案: http://devzone.zend.com/article/8855

解决方法:

插入的附加部分 使用适当的内容类型 HTTP-EQUIV元标记立即跟随开始标记 。

+0

此链接不再有效。你能否更新它或从这个页面粘贴解决方案? – user658182 2017-08-15 04:24:09

26

我有同样的问题,我不能在我的网络服务器中使用整洁。 我发现这个解决方案,它工作得很好:

 
$html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8"); 
$dom = new DomDocument(); 
$dom->loadHTML($html); 
1

有点晚了比赛,但也许它可以帮助别人......

问题可能是在输出中,而不是在DOM/xpath对象本身。

如果您要直接输出nodeValue,您将得到损坏的字符,例如:

ìÂÂì ë¹Â디ì¤ 
ìì ë¹ë””ì¤ í°ì íì¤ 

你必须与第二参数“UTF-8”,new \DomDocument('1.0', 'utf-8')加载你的DOM对象,但仍当你打印DOM节点列表/元素值你破字:

echo $contentItem->item($index)->nodeValue

你必须与utf8_decode包起来:

echo utf8_decode($contentItem->item($index)->nodeValue) //output: 者不終朝而會,愚者可浹旬而學