为什么Python 2允许在字符串对象上使用.encode()?

时间:2018-03-05 14:36:35

标签: python python-2.7 unicode python-unicode

在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,反之亦然?

1 个答案:

答案 0 :(得分:3)

因为在Python 2中,我们的想法是你想要交替,透明地处理字节字符串(str对象)和Unicode字符串(unicode对象)中的文本。当需要字节串时,unicode个对象被透明地编码(到ASCII),相反,当需要Unicode时,str对象被透明地解码,假设再次使用ASCII。

因此str.encode()将首先解码,然后重新编码。或者unicode.decode()首先编码,然后解码结果。

如果您的代码想要接受strunicode个对象并对其进行互换,则只能使用此功能。因此,即使传入仅包含ASCII代码点的unicode对象,期望字节串并尝试解码该字节串的函数也将继续有效。

这导致了大量的混淆和错误(仅在Stack Overflow上搜索UnicodeEncodeErrorUnicodeDecodeError),因此在Python 3中,这些类型被解除了。