我明白了unicode,编码和解码。但我不明白为什么编码功能适用于str类型。我希望它只适用于unicode类型。 因此我的问题是:当它在str而不是unicode上使用时,编码的行为是什么?
答案 0 :(得分:8)
在Python 2中,有两种类型的编解码器可用;那些在str
和unicode
之间转换的转换,以及从str
转换为str
的转换。后者的示例是base64
和rot13
编解码器。
str.encode()
方法支持后者:
'binary data'.encode('base64')
但是现在它存在,人们也将它用于unicode
- > str
个编解码器;编码只能从unicode
转到str
(并以其他方式解码)。为了支持这些,Python将在最终编码之前使用ASCII编解码器隐式将str
值解码为unicode
。
顺便提一下,当使用str
- > str
对象上的unicode
编解码器,Python首先使用相同的ASCII编解码器隐式编码为str
。
在Python 3中,这已通过以下方法解决:a)删除bytes.encode()
和str.decode()
方法(请记住bytes
是旧的str
和{{1}新的str
),以及b)移动unicode
- >仅使用codecs.encode()
和codecs.decode()
函数对str
模块 进行str
编码。同一类型之间的编解码器转换也已得到澄清和更新,请参阅Python Specific Encodings section;请注意'文字'在那里注明的编码,如果在Python 2中可用,则编码为codecs
。
答案 1 :(得分:4)
Python意识到它无法在encode
类型上执行str
,因此它首先尝试decode
它!它使用'ascii'
编解码器,如果您的任何字符的代码点高于0x7f,则会失败。
这就是为什么当您尝试decode
时,有时会发现encode
错误。
答案 2 :(得分:3)
在Python 3中,编码字节字符串根本不起作用。
>>> b'hi'.encode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'bytes' object has no attribute 'encode'
Python 2 尝试在您encode
上调用str
并首先尝试使用{{1} 解码字符串时提供帮助(通常是ascii)和之后对它进行编码。
这就是为什么你得到一个相当奇怪的错误信息,当你尝试用utf-8编码时,用ascii进行解码是不可能的。
sys.getdefaultencoding()
Ned比我更好地解释,从16:20开始观看this。