我正在用elementtree.parse()函数解析一些XML。它可以工作,除了一些utf-8字符(128以上的单字节字符)。我看到默认的解析器是基于expat的XMLTreeBuilder。
是否有一个替代的解析器,我可以使用它可能不那么严格,并允许utf-8字符?
这是我在使用默认解析器时遇到的错误:
ExpatError: not well-formed (invalid token): line 311, column 190
导致这种情况的字符是单字节x92(十六进制)。我不确定这是不是一个有效的utf-8字符。但最好能处理它,因为大多数文本编辑器都将其显示为:
编辑:字符的上下文是:cant,这里我假设它是一个奇特的使徒,但是在十六进制编辑器中,相同的顺序是:63616e9274
字节0x92永远不能作为UTF-8字符的第一个字节有效。但是,它可以作为后续字节有效。有关有效字节序列表,请参见this UTF-8 guide。
你能告诉我们0x92周围是什么字节吗?XML声明是否包含字符编码?
我将从这个问题开始:“是否有一个替代的解析器,我可以使用它可能不那么严格,并允许utf-8字符?”
所有XML解析器都将接受用UTF-8编码的数据。事实上,UTF-8是默认编码。
XML文档可以以如下声明开头:
或者像这样:
<?xml version="1.0"?>
或者根本没有声明。。。在每种情况下,解析器都将使用UTF-8对文档进行解码。但是您的数据不是用UTF-8编码的。。。可能是Windows-1252,也就是cp1252。
如果编码不是UTF-8,那么创建者应该包含一个声明(或者接收者可以在声明前面加一个声明),或者接收者可以将数据转换为UTF-8。以下展示了哪些有效哪些无效:
看起来你有CP1252文本。如果是,则应在文件顶部指定,例如:
这确实适用于ElementTree。
如果您自己创建这些文件,请不要用这种编码方式编写它们。将它们保存为UTF-8并尽自己的一份力量来帮助消除过时的文本编码。
如果您接收的是没有编码规范的CP1252数据,并且您确定它总是CP1252,那么您可以在将其发送到解析器之前将其转换为UTF-8:
相关问题 更多 >
编程相关推荐