【问题标题】:Bug in PHP? : XMLReader::readOuterXml generate "Input is not proper UTF-8" when input IS UTF-8PHP中的错误? :当输入为 UTF-8 时,XMLReader::readOuterXml 生成“输入不是正确的 UTF-8”
【发布时间】:2016-03-08 16:09:30
【问题描述】:

我想我在 PHP 5.5.33 和 5.6.19 的 XMLReader::readOuterXML 中发现了一个错误... PHP 5.2.17 很好,没有使用 7 进行测试。我的 PHP 是 VC11 x86 线程安全的,使用 Apache 2.4。 18 VC11 Win32.

在读取以 UTF-8 正确编码的 XML 文件(带或不带 BOM)时,readOuterXML 有时会生成警告 "Input is not proper UTF-8, indicate encoding !",即使在违规行之前读取了多个 UTF-8 编码字符。

删除了一些标签或字符串的同一个文件将毫无问题地通过。

这是我用来读取 XML 文件的函数的简化版:

function TestXML($file) {
    $XR = new XMLReader;
    $XR->open($file, null, LIBXML_NOBLANKS);

    //Looking for specific node
    while (($lastRead = $XR->read()) && ($XR->name !== 'records')) {
        ;
    }

    if (!$lastRead) {
        echo $file.' : Invalid file or no records';
        $XR->close();
        return;
    }

    //Looking for specific node
    while (($lastRead = $XR->read()) && ($XR->name !== 'record')) {
        ;
    }
    while ($lastRead) {

        $xml = $XR->readOuterXML();
        if ($xml === '') {
            $err = '';
            if ($e = libxml_get_last_error()) {
                $err = $e->message.' (line: '.$e->line.')';
            }
            $XR->close();
            echo $file.' : Problem with file'.($err ? ' — '.$err : '').'.';
            return;
        }

        //Looking for specific node
        while (($lastRead = $XR->next()) && ($XR->name !== 'record')) {
            ;
        }
    }
    $XR->close();
    echo $file.' : Good!';
    return;
}

这是我能产生的最小的 XML(没有 BOM):

<?xml version="1.0" encoding="utf-8"?>
<records>

<record><aaa><bbbb><ccc><![CDATA[XXX Xxxxxxxxxxxx]]></ccc><ddd><![CDATA[XXX Xx]]></ddd></bbbb><eee><![CDATA[Xxxxx xxxxxxx: xxxx://xxx.xxx.xx.xx/xxxx?xxxxXx=0xx000x0-000x-0xx0-x000-x0000xx0xx00
Xxxxxxxxxxxx xx Xxxxxxxxxxxx Xxxxxxxxx xx Xxxxxxxxx Xxxxxxxxxxxx Xxxxxxxxxxx Xxxxxxxxxxxx (XXX Xxxxxxxxxxxx), xxxxxxxxx xxxxxxx xx Xxx Xxxxxxxxxx Xxxxxxxxxx Xxx.]]></eee></aaa><fff><bbbb><ggg><![CDATA[Xxxxxxxxx Xxxxxxxxxxxxxxx Xxxxxxxxxx xx Xxxxxxxxxxxx]]></ggg><ccc><![CDATA[XXX Xxxxxxxxxxxx]]></ccc></bbbb><hhh><![CDATA[Xx xxxxx, xx xxxxxxxxxxx XXX Xxxxxxxxxxxx x xxxxxcé x’xxxxxxxx xxx x’Xxxxxxléx léxxxxxxxxx xx xx xxxxxxxx xx xx Xxxxxxxxxx Xxxxxxxxxx Xxx (xxx xxx xx xxxxxxxxxx xxxxxxxxx). Xxxxx xxx xréxxxx xxx xxxxxx xxx déxxxxxxxx XXX Xxxxxxxxxxxx xx xxxx xx’xxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxréxxxxxxtéx xx xxxxxxx xxx XX, xxx XXX xx xxx XXX xx xx xxxxxxxx xx xxxxx x’xxxxxxxx xx xxxxx xx xxxxxxxxx xxxxxxxxxxxxx xxréé (XXX). (Xxxxxxxxéx XXX - Xxx 0000)]]></hhh></fff></record>

</records>

由于添加几个空格可以解决问题(例如,如果上面是美化的,它不会引起问题),我已经上传了我用于测试的文件:

Bad file(不带 BOM)
Bad file(带 BOM 和从 &lt;ggg&gt; 标记的内容中删除的几个“x”)
Good file(与坏的相同,少&lt;ccc&gt; 标签)。
您还可以从 Bad 文件中删除几个“单词”,它会通过。

那么,这真的是 PHP 中的一个错误,还是我只是遗漏了什么?

【问题讨论】:

  • 它确实被确认为 libxml 2.9.3 (bug #760183) 中的一个错误 (bug #71805),它从 5.5.32 和 5.6.18 开始在 PHP 中使用

标签: xmlreader php-5.5 php-5.6


【解决方案1】:

这是一个与 libxml2 相关的错误。 从此 URL 将此库升级到最新版本: https://git.gnome.org/browse/libxml2/

【讨论】:

  • 应该是评论。
【解决方案2】:

只是为了结束这个问题:正如我在comment 中提到的,这是最近修复的 PHP 中的一个错误。据我所知,受影响的 PHP 版本是 5.5.32、5.5.33、5.5.34、5.5.35、5.6.18、5.6.19、5.6.20 和 5.6.21。

【讨论】:

    【解决方案3】:

    修复了安装libxml2-devsudo apt-get install libxml2-dev

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 2019-01-08
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多