在Python 2中,您可以调用str.decode
来获取unicode对象,使用unicode.encode
来获取str对象。
>>> "foo".decode('utf-8')
u'foo'
>>> u"foo".encode('utf-8')
'foo'
Python 3类似,使用bytes.decode
获取字符串,使用str.encode
获取字节对象。
>>> "foo".encode('utf-8')
b'foo'
>>> b"foo".decode('utf-8')
'foo'
然而,Python 2(但不是Python 3)也提供了错误的方法:您可以在.encode
对象上调用str
,或在unicode对象上调用.decode
! / p>
>>> "foo".encode('utf-8')
'foo'
>>> u"foo".decode('utf-8')
u'foo'
这是为什么?是否有时间在unicode对象上调用.decode
,反之亦然?
答案 0 :(得分:3)
因为在Python 2中,我们的想法是你想要交替,透明地处理字节字符串(str
对象)和Unicode字符串(unicode
对象)中的文本。当需要字节串时,unicode
个对象被透明地编码(到ASCII),相反,当需要Unicode时,str
对象被透明地解码,假设再次使用ASCII。
因此str.encode()
将首先解码,然后重新编码。或者unicode.decode()
首先编码,然后解码结果。
如果您的代码想要接受str
或unicode
个对象并对其进行互换,则只能使用此功能。因此,即使传入仅包含ASCII代码点的unicode
对象,期望字节串并尝试解码该字节串的函数也将继续有效。
这导致了大量的混淆和错误(仅在Stack Overflow上搜索UnicodeEncodeError
和UnicodeDecodeError
),因此在Python 3中,这些类型被解除了。