赞
踩
你(在评论中)问:“这就是让我困惑的地方。它是如何从最初的强调到现在的?当你说用utf8和latin1进行双重编码时,总共有3次编码吗(2次utf8+1次latin1)?从原始状态到当前状态的编码顺序是什么?
在马克·拜尔斯的回答中,他说:“你似乎是一个被错误解码的UTF-8编码。”你已经接受了他的回答。但你还是很困惑?好的,这里是一次又一次的描述:
注意:所有字符串将使用(隐式)显示
repr()
.
unicodedata.name()
将用于验证内容。这样,控制台编码的变化就不会混淆字符串的解释。
初始状态:您有一个名为U1的Unicode对象。它含有E-急性:
>>> 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是使用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通常(见下面的注释)是一个胡说八道;如果你运气好,它会引发一个例外;如果你运气不好,它会悄悄地制造出乱说。另外,请理解,无声地创建乱码并不是一个bug——Python(或任何其他语言)无法检测出已提交的胡说八道。这一点尤其适用于涉及Latin1的情况,因为所有256个码点都用前256个Unicode码点映射1到1,因此不可能从str ou object.decode(“Latin1”)中获得unicode decode错误。
当然,不正常地(人们希望它是不正常的),你可能需要通过做来扭转这种胡说八道。
gibberish_unicode_object.encode('y').decode('x')
如你问题的各种答案所建议的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。