首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XMLReader编码错误

XMLReader编码错误
EN

Stack Overflow用户
提问于 2009-05-04 09:19:53
回答 3查看 8.2K关注 0票数 1

我有一个PHP脚本,它试图解析一个巨大的XML文件。为此,我使用了XMLReader库。在解析过程中,我遇到了这样的编码错误:

输入不是正确的UTF-8,请指示编码!字节: 0xA0 0x32 0x36 0x30

我想知道它们是否是一种跳过包含错误字符的记录的方法。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2009-05-04 11:29:16

首先,确保您的XML文件确实是UTF-8编码的。如果不是,则将编码指定为XMLReader::open()的第二个参数。

如果编码错误是由于UTF-8文档中的实际错误字节序列造成的,并且如果您使用的是PHP > 5.2.0,则可以将LIBXML_NOERROR和/或(取决于错误级别) LIBXML_NOWARNING作为位掩码传递给XMLReader::open()的第三个参数

代码语言:javascript
复制
$xml = new XMLReader(); 
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING); 

如果你使用的是PHP > 5.1.0,你可以调整libXML错误处理。

代码语言:javascript
复制
// enable user error handling
libxml_use_internal_errors(true);
/* ... do your XML processing ... */
$errors = libxml_get_errors();
foreach ($errors as $error) {
    // handle errors here
}
libxml_clear_errors();

实际上,我不知道前面两个变通方法实际上是否允许XMLReader在发生错误时继续读取,或者它们是否只禁止错误输出。但这值得一试。

回复评论:

libXML定义了XML_PARSE_RECOVER (1),但是ext/libxml没有将这个常量公开为PHP常量。也许可以将整数值1传递给$options参数。

代码语言:javascript
复制
$xml = new XMLReader(); 
$xml->open('myxml.xml', null, LIBXML_NOERROR | LIBXML_NOWARNING | 1); 
票数 8
EN

Stack Overflow用户

发布于 2009-05-04 12:11:40

我会听听XMLReader对你说的话。请记住,许多编码都是ASCII的超集,因此(例如)对于前128个代码点,UTF-8和ISO-8859-1与ASCII相同。很可能您的文件实际上是按照ISO-8859-1编码的,但中的几乎所有字符都来自该字符集的较低的ASCII半部分。在这种情况下,如果让它使用XML的默认编码UTF-8,那么错误就是您的了。

在ISO-8859-1中,字节序列0xA0 0x32 0x36 0x30是完全有效的:后跟“2”、“6”、“0”的不间断空格。

票数 2
EN

Stack Overflow用户

发布于 2009-05-04 11:35:12

如果您的XML文件的结构非常简单,那么您可以对其进行“预过滤”,以去除(或者更好地,纠正)错误的记录。

逐条记录读取并写出过滤后的xml文件,然后对过滤后的文件进行处理。

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

https://stackoverflow.com/questions/819414

复制
相关文章

相似问题

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