问题所在
msg = u'xe3x80x90xe4xb8xadxe5xadx97xe3x80x91'result = msg.depre('utf8')是您正在尝试解码Unipre。那真的没有道理。您可以 从 Unipre编码为某种编码类型,也可以将字节字符串解码 为 Unipre。
当你做
msg.depre('utf8')Python
2看到这
msg是Unipre。它知道它无法解码Unipre,因此“有帮助”地假定您要
msg使用默认的ASCII编解码器进行编码,以便可以使用UTF-8编解码器将该转换的结果解码为Unipre。Python
3的行为更加明智:代码会因以下原因而失败
AttributeError: 'str' object has no attribute 'depre'
kennytm的答案中给出的技术:
msg.enpre('latin1').depre('utf-8')之所以起作用,是因为小于256的Unipre代码点直接对应于Latin1编码中的字符(也称为ISO
8859-1)。
这是一些Python 2代码,说明了这一点:
for i in xrange(256): lat = chr(i) uni = unichr(i) assert lat == uni.enpre('latin1') assert lat.depre('latin1') == uni这是等效的Python 3代码:
for i in range(256): lat = bytes([i]) uni = chr(i) assert lat == uni.enpre('latin1') assert lat.depre('latin1') == uni您可能会发现这篇文章很有帮助:实用Unipre,由SO老手Ned
Batchelder编写。
除非您被迫使用Python 2,否则我强烈建议您切换到Python3。这将大大减少处理Unipre的痛苦。



