首页 > 解决方案 > 无法使用 Ã 字符解码不正确编码的字符串

问题描述

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

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

我怎样才能做到这一点?

标签: pythonencodingutf-8mojibake

解决方案


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

如果您的输入值是从 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字节(在大多数基于拉丁语的编解码器中未映射到可打印字符)已在某处被过滤掉。您不能凭空重新创建它,因为C3UTF-8 对的字节可以在任意数量的其他字节之前,所有这些都会产生有效的输出:

>>> 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 种不同的可能性。


推荐阅读