始终从 unicode编码为字节。
在这个方向上,您可以选择编码。
>>> 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 “whack-a-mole”,了解数据级别发生的事情很重要。这里用另一种方式解释:
- 一个 unicode 对象已经被解码,你永远不想调用
decode
它。
- 字节串对象已经编码,你永远不想调用
encode
它。
现在,在看到.encode
字节字符串时,Python 2 首先尝试将其隐式转换为文本(unicode
对象)。同样,在看到.decode
unicode 字符串时,Python 2 会隐式尝试将其转换为字节(str
对象)。
这些隐式转换是您在调用. 这是因为 encoding 通常接受 type 的参数;接收参数时,在使用另一种编码重新编码之前,会隐式解码为类型的对象。此转换选择默认的“ascii”解码器†</sup>,为您提供编码器内的解码错误。Unicode
Decode
Error
encode
unicode
str
unicode
事实上,在 Python 3 中这些方法str.decode
甚至bytes.encode
都不存在。他们的移除是一种[有争议的]试图避免这种常见的混淆。
†</sup> ...或任何编码sys.getdefaultencoding()
提到的;通常这是'ascii'