关于unicode:Python字符串和str()方法编码和解码

Python strings and str() method encoding and decoding

我看到python手册提到了.encode().decode()字符串方法。在python cli上,我看到我可以用与"常规"字符串'hello'不同的数据类型创建unicode字符串u'hello',并可以用str()转换/转换。但真正的问题是,当使用ASCII127u'????'以上的字符时,我很难从经验上确定到底发生了什么。

堆栈溢出溢出了关于python的unicode和字符串编码/解码处理的混淆示例。

当使用str()方法对字符串进行编码和解码时,特别是当字符串中包含不能用7个字节表示的字符时,会发生什么情况(字节是如何更改的,数据类型是如何更改的)?像看起来的那样,一个数据类型为的python变量可以同时被编码和解码吗?如果它是编码的,我理解这意味着字符串由utf-8、iso-8859-1或其他一些编码表示,这是正确的吗?如果它被解码了,这意味着什么?解码后的字符串是否为Unicode?如果是这样,那么为什么它们没有数据类型呢?

为了让以后阅读本文的人感兴趣,我认为应该同时讨论python 2和python 3。谢谢您!


在python 2中只有这种情况。python 2字符串上存在一个decode方法是一个缺点,在python 3中已经改变了这个缺点(其中等价的bytes只有decode)。

不能对已经编码的字符串进行"编码"。当您在str上调用encode时,会发生什么情况:python使用默认编码(通常是ASCII)隐式调用decode。这几乎总是不是你想要的。在将str转换为其他编码之前,应该始终调用decode将str转换为unicode。

(解码后的字符串是unicode,它们的类型是,所以我不知道您所说的那个问题是什么意思。)

当然,在Python3中,字符串默认为Unicode。你只能将它们编码到bytes——正如我上面提到的,它只能被解码。