无法解码带有Ã字符的编码错误的字符串

时间:2018-09-05 10:43:53

标签: python encoding utf-8 mojibake

我正在尝试对此进行编码:

"LIAISONS Ã  NEW YORK" 

对此:

"LIAISONS à  NEW YORK"

print(ascii(value))的输出是

'LIAISONS \xc3  NEW YORK'

我先尝试在cp1252中进行编码,然后尝试对utf8进行解码,但是我得到了:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 9: invalid continuation byte

我还尝试使用Latin-1 / ISO-8859-2进行编码,但是这种方法也不起作用。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您无法从输入值转到所需的输出,因为数据不再完整。

如果您输入的值是实际的Mojibake从UTF-8重新编码为拉丁编码,那么对于à码点,您将有两个字节:

>>> target = "LIAISONS à NEW YORK"
>>> target.encode('UTF-8').decode('latin1')
'LIAISONS Ã\xa0 NEW YORK'

这是因为à的UTF-8编码为C3 A0:

>>> 'à'.encode('utf8').hex()
'c3a0'

在您的输入中,A0字节(在大多数基于拉丁语的编解码器中不映射到可打印的字符)已被过滤掉。您不能凭空重新创建它,因为UTF-8对的C3字节可以在其他任何字节之前,所有这些都会导致有效输出:

>>> b'\xc3\xa1'.decode('utf8')
'á'
>>> b'\xc3\xa2'.decode('utf8')
'â'
>>> b'\xc3\xa3'.decode('utf8')
'ã'
>>> b'\xc3\xa4'.decode('utf8')
'ä'

,如果没有其他自然语言处理,就很难选择其中之一。在这种情况下,字节80-A0和AD均为UTF-8中的有效连续字节,但是这些字节均未导致可打印的Latin-1字符,因此这里至少有18种不同的可能性。