readOuterXml(),输入不正确的UTF-8,表示编码

时间:2013-11-27 14:17:42

标签: php xml utf-8 character-encoding xmlreader

我正在使用 XMLReader 来解析来自第三方的大型XML文件,文件大小为1GB +。 XML文件将编码指定为UTF8(<?xml version="1.0" encoding="utf-8" ?>),尽管它不是。

由于未知的编码类型,XMLReader会抛出错误,但直到它已经处理了大部分文件时才会抛出错误。

异常消息:

  

输入不正确UTF-8,表示编码

我已确定该文件的真实编码为ISO-8859-1,如果我在调用$reader->open()时手动指定此编码,它将正常工作。

问题是我的脚本需要解析数据库中的未知文件,因此需要依赖文件中指定的编码类型。我需要找到一种解析任何文件的方法,无论其编码如何,是否有任何建议?

2 个答案:

答案 0 :(得分:0)

我发现vim非常擅长从一种编码转换为另一种编码。

我的诀窍是正常解析文件,当遇到编码错误时,只需用vim重新编码文件并再次开始解析。

这是一个粗略的想法:

$xmlFile = '/path/to/file.xml';

// Parse the file in a loop
while(...)
{

    try
    {
        // Normal parsing logic...

        $reader->readOuterXml();

        //...
    }
    catch(Exception $ex)
    {
        $encoding = getXMLEncoding($xmlFile) ?: 'utf-8';

        exec(sprintf(VIM_PATH . ' -c "set fileencoding=%s" -c "wq" "%s"', $encoding, $xmlFile));

        // File has been re-encoded
        // The real encoding should now match the declared encoding

        // -> Go back to the beginning and parse the file again
    }

}

使用此方法可能会产生1或2个字符,但它比完全失败的解析更好。理想情况下,第三方会正确标记其文件。

我的系统是Windows,因此Linux上的vim参数可能不同(不知道)。

答案 1 :(得分:-2)

使用simplexml_load_file解析XML。为避免编码问题,请对数据使用utf8_encode