如何强制XPath使用UTF8?

时间:2009-07-20 16:25:11

标签: php xhtml xpath utf-8

我有一个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?

5 个答案:

答案 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元标记立即生效   按照开头标记。