3

我看到Python 手册提到.encode().decode()字符串方法。在 Python CLI 上玩耍,我发现我可以创建u'hello'具有与“常规”字符串不同的数据类型的 unicode 字符串,'hello'并且可以使用str(). 但真正的问题始于使用 ASCII 127 以上的字符u'שלום',我很难凭经验确定到底发生了什么。

堆栈 溢出充满 关于混淆例子 unicode 字符串编码/解码 处理

str()使用该方法对字符串进行编码和解码时,尤其是当字符串中包含无法用 7 个字节表示的字符时,究竟会发生什么(字节如何更改,以及数据类型如何更改) ?看起来,具有数据类型的 Python 变量<type 'str'>可以被编码和解码,这是真的吗?如果它是编码的,我理解这意味着该字符串由 UTF-8、ISO-8859-1 或其他编码表示,这是正确的吗?如果它被解码,这是什么意思?解码的字符串是 unicode 吗?如果是这样,那么为什么他们没有数据类型<type 'unicode'>

为了那些稍后将阅读本文的人的兴趣,我认为 Python 2 和 Python 3 都应该得到解决。谢谢!

4

1 回答 1

3

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

您不能“编码”已经编码的字符串。当您调用encodea时会发生什么,Python使用默认编码(通常是 ASCII)str隐式调用decode它。这几乎总是不是你想要的。在将 str 转换为不同的编码之前,您应该始终调用将其转换为 unicode。decode

(解码后的字符串unicode,而且它们确实有 type <unicode>,所以我不知道你说的那个问题是什么意思。)

当然,在 Python 3 中,字符串默认是 unicode。您只能将它们编码为bytes- 正如我上面提到的,它只能被解码。

于 2013-06-12T10:50:52.027 回答