始终从unicode 编码为字节。
在这个方向上,您可以选择encoding。
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好
另一种方法是从字节解码为unicode。
在这个方向上,您必须知道什么是编码。
>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好
这一点压力不够大。如果您想避免播放unicode的“打hack鼠”游戏,那么了解数据级别的情况很重要。这里说明了另一种方式:
- 一个unicode对象已经被解码了,您再也不想调用
decode
它了。
- 一个字节串对象已经被编码,您永远不想调用
encode
它。
现在,在看到.encode
字节字符串时,Python 2首先尝试将其隐式转换为文本(unicode
对象)。同样,在看到.decode
unicode字符串时,Python 2隐式尝试将其转换为字节(str
对象)。
这些隐式转换是您致电时可以得到的原因。这是因为编码通常接受type的参数;接收参数时,在使用另一种编码对它进行重新编码之前,会对类型进行隐式解码。此转换选择默认的“ ascii”解码器†,给您编码器内部的解码错误。Unicode
Decode
Error
encode
unicode
str
unicode
事实上,在Python 3的方法str.decode
和bytes.encode
甚至不存在。为了避免这种常见的混淆,将它们移除是一个有争议的尝试。
† ...或任何编码sys.getdefaultencoding()
提及的内容;通常这是“ ascii”