在python中的str上使用encode时会发生什么?

时间:2016-02-26 21:47:30

标签: python string unicode encode python-2.x

我明白了unicode,编码和解码。但我不明白为什么编码功能适用于str类型。我希望它只适用于unicode类型。 因此我的问题是:当它在str而不是unicode上使用时,编码的行为是什么?

3 个答案:

答案 0 :(得分:8)

在Python 2中,有两种类型的编解码器可用;那些在strunicode之间转换的转换,以及从str转换为str的转换。后者的示例是base64rot13编解码器。

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