【问题标题】:Can't decode an improperly encoded string with à character无法使用 à 字符解码不正确编码的字符串
【发布时间】:2018-09-05 10:43:53
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

  • 您能否提供print(ascii(inputvalue)) 的输出以帮助我们了解您拥有的实际数据?如果您有 mojibake,那么可能缺少一些额外的字节,以便从 UTF-8 重新编码(特别是 à 的 UTF-8 编码中的 A0 字节,C3 A0)。
  • 确定输出:'LIAISONS \xc3 NEW YORK'
  • 那你就回不了UTF-8了,丢失的字节已经没有了。
  • 哦,真不走运,请回答

标签: python encoding utf-8 mojibake


【解决方案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 种不同的可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2015-03-10
    • 2012-02-26
    • 2015-10-27
    相关资源
    最近更新 更多