首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP中的Bug : XMLReader::readOuterXml在输入为UTF-8时生成“输入不是正确的UTF-8”

PHP中的Bug : XMLReader::readOuterXml在输入为UTF-8时生成“输入不是正确的UTF-8”
EN

Stack Overflow用户
提问于 2016-03-08 16:09:30
回答 3查看 701关注 0票数 2

我想我在PHP5.5.33和5.6.19的XMLReader::readOuterXML中发现了一个bug .PHP5.2.17很好,没有用7进行测试,我的PHP是VC11 x86线程安全,Apache2.4.18 VC11 Win32。

当读取一个用UTF-8正确编码的XML文件(不管有没有BOM)时,readOuterXML有时会生成警告"Input is not proper UTF-8, indicate encoding !",尽管在违规行之前读取了几个UTF-8编码字符。

删除了一些标记或字符串的同一个文件将顺利通过。

这是用于读取XML文件的函数的简化版本:

代码语言:javascript
运行
复制
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),它会产生问题:

代码语言:javascript
运行
复制
<?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>

由于问题可以通过添加几个空格(例如,如果上面的内容很漂亮,就不会引起问题)消失,所以我已经上传了用于测试的文件:

坏文件 (无BOM)

坏文件 (从<ggg>标记的内容中删除了BOM和几个“x”)

良好档案 (与Bad相同,减去<ccc>标记)。

您还可以从坏文件中删除几个“单词”,它将通过。

那么,这是PHP中的一个bug,还是我只是遗漏了什么呢?

EN

Stack Overflow用户

回答已采纳

发布于 2016-06-06 11:39:17

为了结束这个问题:正如我的评论中提到的,这是PHP中的一个最近修复的bug。据我所知,受影响的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。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35872301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档