你问(在评论中)“”“这让我感到困惑。它是如何从原来的重音变成现在的?当你说 utf8 和 latin1 的双重编码时,总共是 3 个编码(2 个 utf8 + 1 latin1)?从原始状态到当前状态的编码顺序是什么?"""
在 Mark Byers 的回答中,他说“”“你所拥有的似乎是一个被错误解码的 UTF-8 编码”“”。你已经接受了他的回答。但是你还在疑惑吗?好的,这里是逐个描述:
注意:所有字符串都将使用 (隐式) 显示repr()
。unicodedata.name()
将用于验证内容。这样,控制台编码的变化就不会混淆字符串的解释。
初始状态:您有一个名为 u1 的 unicode 对象。它包含 e-acute:
>>> u1 = u'\xe9'
>>> import unicodedata as ucd
>>> ucd.name(u1)
'LATIN SMALL LETTER E WITH ACUTE'
您将 u1 编码为 UTF-8 并将结果命名为 s:
>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'
您使用 latin1 解码 s -- 不正确;s 使用 utf8 编码,而不是 latin1。结果是毫无意义的垃圾。
>>> u2 = s.decode('latin1')
>>> u2
u'\xc3\xa9'
>>> ucd.name(u2[0]); ucd.name(u2[1])
'LATIN CAPITAL LETTER A WITH TILDE'
'COPYRIGHT SIGN'
>>>
请理解:unicode_object.encode('x').decode('y)
当 x != y 通常 [见下面的注释] 是胡说八道;如果幸运的话,它会引发异常;如果你不走运,它会默默地制造胡言乱语。另请理解,默默地创建胡言乱语不是错误——Python(或任何其他语言)无法检测到已提交的废话。这尤其适用于涉及 latin1 的情况,因为所有 256 个代码点都将前 256 个 Unicode 代码点映射为 1 到 1,因此不可能从 str_object.decode('latin1') 获得 UnicodeDecodeError。
当然,异常(人们希望它是异常的)您可能需要按照gibberish_unicode_object.encode('y').decode('x')
您的问题的各种答案中的建议来扭转这种废话。