如何强制XPath来使用UTF8?(How to force XPath to use UTF8?)

2019-07-30 12:06发布

我有被传递到通过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?

Answer 1:

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



Answer 2:

我有同样的问题,在我的web服务器我无法用整洁。 我发现这个解决方案,它工作得很好:

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


Answer 3:

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

否则,有一个在DOM文档编码属性 ,这是可写的。

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



Answer 4:

有点在游戏后期,但也许它可以帮助别人...

这个问题可能是在输出中,而不是在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: 者不終朝而會,愚者可浹旬而學



Answer 5:

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

解决方法:

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



文章来源: How to force XPath to use UTF8?