我看到Python手册提到了.encode()
和.decode()
字符串方法。在Python CLI上玩,我看到我可以创建具有不同数据类型的unicode字符串u'hello'
,而不是"常规"字符串'hello'
,并且可以使用str()
转换/强制转换。但是当使用ASCII 127 u'שלום'
以上的字符时,真正的问题开始了,我很难根据经验确定到底发生了什么。
Stack Overflow充满了关于Python的unicode和字符串编码/解码处理的混淆示例。
当使用str()
方法编码和解码字符串时,特别是当字符串中包含不能用7个字节表示的字符时,究竟发生了什么(字节是如何改变的,以及数据类型是如何改变的)?它是真的,因为它似乎,一个Python变量的数据类型<type 'str'>
可以编码和解码?如果它是编码的,我理解这意味着字符串由UTF-8、ISO-8859-1或其他编码表示,这是正确的吗?如果它被解码了,这意味着什么?解码后的字符串是unicode吗?如果有,那么为什么它们没有数据类型<type 'unicode'>
呢?
为了那些稍后会读到这篇文章的人的兴趣,我认为应该解决Python 2和Python 3。谢谢你!
这只在Python 2中出现。在Python 2的字符串上存在decode
方法是一个缺陷,这在Python 3中已经改变了(等效的bytes
只有decode
)。
你不能"编码"一个已经编码的字符串。当你在str
上调用encode
时,Python会使用默认编码隐式调用decode
,通常是ASCII。这通常不是你想要的。在将str转换为其他编码之前,您应该始终调用decode
将其转换为unicode。
(和解码字符串是 unicode,他们做类型<unicode>
,所以我不知道你的意思是什么问题。)
当然,在Python 3中字符串默认是unicode。您只能将它们编码为bytes
-正如我上面提到的,它只能被解码。