无法解码带有 Ã 字符的编码不正确的字符串
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 种不同的可能性。
我正在尝试对此进行编码:
"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 种不同的可能性。