我正在使用 XMLReader 来解析来自第三方的大型XML文件,文件大小为1GB +。 XML文件将编码指定为UTF8(<?xml version="1.0" encoding="utf-8" ?>
),尽管它不是。
由于未知的编码类型,XMLReader会抛出错误,但直到它已经处理了大部分文件时才会抛出错误。
异常消息:
输入不正确UTF-8,表示编码
我已确定该文件的真实编码为ISO-8859-1
,如果我在调用$reader->open()
时手动指定此编码,它将正常工作。
问题是我的脚本需要解析数据库中的未知文件,因此需要依赖文件中指定的编码类型。我需要找到一种解析任何文件的方法,无论其编码如何,是否有任何建议?
答案 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。