使用DOMDocument解析xml文件时的字符编码

时间:2014-11-02 04:02:14

标签: php xml character-encoding domdocument

我在读取xml文件时遇到错误的字符编码问题。

虽然这个正确地显示了文件的完整内容......

$reader = new DOMDocument();
$reader->preserveWhiteSpace  = false;
$reader->load('zip://content.odt#content.xml');
echo $reader->saveXML();

...这个给了我一个奇怪的输出(德语变音符号,em破折号,μ或类似字符未正确显示):

$reader = new DOMDocument();
$reader->preserveWhiteSpace  = false;
$reader->load('zip://content.odt#content.xml');
$elements = $reader->getElementsByTagName('text');
foreach($elements as $node){
    foreach($node->childNodes as $child) {
        $content .= $child->nodeValue;
    }
}
echo $content;

我不知道为什么会这样。希望有人可以向我解释。

1 个答案:

答案 0 :(得分:0)

DOMDocument::saveXML()

此方法将整个XML文档作为字符串返回。与任何XML文档一样,编码在XML declaration中给出,或者它具有UTF-8的默认编码。

DOMNode::$nodeValue

包含节点的值,通常是文本。 DOMDocument 库返回的所有文本字符串 - 其中 DOMNode 是其中的一部分 - 采用UTF-8编码,无论XML文档的编码如何。

当你写下如果你显示第一个:

echo $reader->saveXML();

所有的变音符号都会被保留,因此XML本身最有可能使用不同的编码作为UTF-8,因为后者

$content .= $child->nodeValue;
...
echo $content;

没有。

由于您不能分享您显示和阅读输出的应用程序以及使用哪种应用程序,因此可以说不多。

您很可能需要在后一种情况下将字符编码提示给显示应用程序。例如,如果您在浏览器中显示文本,则应在最开始添加适当的内容类型标题:

header("Content-Type: text/plain; charset=utf-8");

How to set UTF-8 encoding for a PHP file比较。