总是编码从unicode到012字节的。
在这个方向上,你可以选择编码。
>>> 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
对象)。同样,在看到一个unicode字符串上的.decode
时,Python 2会隐式地尝试将其转换为字节(str
对象)。
这些隐式转换是为什么你可以得到Unicode
Decode
Error
当你叫encode
。这是因为编码通常接受unicode
类型的参数;当收到str
参数时,在用另一种编码对其进行重新编码之前,会对unicode
类型的对象进行隐式解码。此转换选择默认的“ascii”解码器,给您编码器内部的解码错误。
事实上,在Python 3的方法str.decode
和bytes.encode
甚至不存在。他们的撤除是一个[有争议]的尝试,以避免这种常见的混淆。
† ...或任何编码sys.getdefaultencoding()
提及;通常这是 'ASCII'
来源
2012-03-10 05:14:14
wim
那么解决方案是什么?特别是如果我没有字符串文字,我只是有一个字符串对象。 – 2013-03-12 07:57:52
@JonTirsen,你不应该编码一个字符串对象。一个字符串对象已经被编码。如果您需要更改编码,则需要将其解码为一个unicode字符串,然后将其编码为所需的编码。 – 2013-03-12 16:24:36
因此,从上面清楚地说明你可以''你好'.decode('utf-8')。encode('utf-8')' – deinonychusaur 2013-07-25 08:18:27