0

我正在尝试使用 expat 解析 XML 文件(OSM 数据),并且有些行带有一些 expat 无法解析的 Unicode 字符:

<tag k="name"
v="абвгдежзиклмнопр�?туфхцчшщьыъ�?ю�?�?БВГДЕЖЗИКЛМ�?ОПРСТУФХЦЧШЩЬЫЪЭЮЯ" />

<tag k="name" v="Cin\x8e? Rex" />

(开头行中的 XML 文件编码为“UTF-8”)

文件很旧,肯定有错误。在现代文件中,我看不到 UTF-8 错误,它们被解析得很好。但是如果我的程序遇到损坏的符号怎么办,我可以采取什么解决方法?是否可以加入 bz2 编解码器(我解析压缩文件)和 utf-8 编解码器以忽略损坏的字符,或者将它们更改为“?”?

4

1 回答 1

1

不确定 '�' 字符是否是由此处的复制粘贴字符串引入的,但如果您在原始数据中有它们,那么它似乎是生成器问题,它引入了 \uFFFD 字符:

“用于替换其值在 Unicode 中未知或无法表示的传入字符”

引自: http ://www.fileformat.info/info/unicode/char/fffd/index.htm

解决方法?只是扩展的想法:

good = True
buf = None
while True:
if good:
        buf = f.read(buf_size)
        else:
        # try again with cleaned buffer
        pass
        try:
            xp.Parse(buf, len(buf) == 0)
            if (len(buf) == 0):
                    break
        good = True
    except ExpatError:
        if xp.ErrorCode  == XML_ERROR_BAD_CHAR_REF:
            # look at ErrorByteIndex (or nearby)
            # for 0xEF 0xBF 0xBD (UTF8 replacement char) and remove it
            good = False
        else:
            # other errors processing
            pass

或者清理输入缓冲区而不是+极端情况(缓冲区末端的部分序列)。我不记得 python 的 expat 是否允许分配自定义错误处理程序。那会更容易。

如果我从“�”字符中清除您的样本,则处理正常。\xd1 不会失败。

OSM 数据?

于 2010-03-23T01:17:05.650 回答