无法解码带有 Ã 字符的编码不正确的字符串

Can't decode an improperly encoded string with à character

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

"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 中进行编码,但这也不起作用。

我该怎么做?

您不能从您的输入值转到您想要的输出,因为数据不再完整。

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

>>> 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 中的有效连续字节,但是这些字节的 none 会产生可打印的 Latin-1 字符,因此这里至少有 18 种不同的可能性。