gpt4 book ai didi

Python - 处理混合编码文件

转载 作者:IT老高 更新时间:2023-10-28 21:17:55 30 4
gpt4 key购买 nike

我有一个主要是 UTF-8 的文件,但也发现了一些 Windows-1252 字符。

我创建了一个表格来将 Windows-1252 (cp1252) 字符映射到对应的 Unicode 字符,并希望使用它来修复错误编码的字符,例如

cp1252_to_unicode = {
"\x85": u'\u2026', # …
"\x91": u'\u2018', # ‘
"\x92": u'\u2019', # ’
"\x93": u'\u201c', # “
"\x94": u'\u201d', # ”
"\x97": u'\u2014' # —
}

for l in open('file.txt'):
for c, u in cp1252_to_unicode.items():
l = l.replace(c, u)

但是尝试以这种方式进行替换会导致引发 UnicodeDecodeError,例如:

"\x85".replace("\x85", u'\u2026')
UnicodeDecodeError: 'ascii' codec can't decode byte 0x85 in position 0: ordinal not in range(128)

关于如何处理这个问题的任何想法?

最佳答案

如果您尝试将此字符串解码为 utf-8,如您所知,您将收到“UnicodeDecode”错误,因为这些虚假的 cp1252 字符是无效的 utf-8 -

但是,Python 编解码器允许您注册 callback to handle encoding/decodin g 错误,使用 codecs.register_error 函数 - 它获取 UnicodeDecodeerror a a 参数 - 您可以编写一个尝试将数据解码为“cp1252”的处理程序,并继续以 utf-8 解码字符串的其余部分。

在我的 utf-8 终端中,我可以构建一个混合的错误字符串,如下所示:

>>> a = u"maçã ".encode("utf-8") + u"maçã ".encode("cp1252")
>>> print a
maçã ma��
>>> a.decode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 9-11: invalid data

我在这里写了上述回调函数,发现了一个问题:即使你将解码字符串的位置加 1,这样它就会从下一个字符开始,如果下一个字符也不是 utf- 8 和超出范围(128),错误在第一个超出范围(128)字符时引发 - 这意味着,如果发现连续的非 ascii、非 utf-8 字符,则解码“后退”。

这一轮的工作是在 error_handler 中有一个状态变量,它检测到这个“后退”并从最后一次调用它恢复解码 - 在这个简短的例子中,我将它实现为一个全局变量 - (它将有在每次调用解码器之前手动重置为“-1”):

import codecs

last_position = -1

def mixed_decoder(unicode_error):
global last_position
string = unicode_error[1]
position = unicode_error.start
if position <= last_position:
position = last_position + 1
last_position = position
new_char = string[position].decode("cp1252")
#new_char = u"_"
return new_char, position + 1

codecs.register_error("mixed", mixed_decoder)

在控制台上:

>>> a = u"maçã ".encode("utf-8") + u"maçã ".encode("cp1252")
>>> last_position = -1
>>> print a.decode("utf-8", "mixed")
maçã maçã

关于Python - 处理混合编码文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10009753/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com