【发布时间】:2015-10-21 11:09:14
【问题描述】:
我仍然不完全理解 python 的 unicode 和 str 类型是如何工作的。注意:我正在使用 Python 2,据我所知 Python 3 对同一问题有完全不同的方法。
我所知道的:
str 是一种较老的野兽,它保存了以历史迫使我们使用的太多编码方式之一编码的字符串。
unicode 是一种更标准化的字符串表示方式,它使用包含所有可能字符、表情符号、狗便便的小图片等的巨大表格。
decode 函数将字符串转换为 unicode,encode 则相反。
如果我在 python 的 shell 中,简单地说:
>>> my_string = "some string"
那么my_string 是一个str 变量,编码在ascii 中(并且,因为ascii 是utf-8 的子集,它也编码在utf-8 中)。
因此,例如,我可以通过说出以下几行将其转换为 unicode 变量:
>>> my_string.decode('ascii')
u'some string'
>>> my_string.decode('utf-8')
u'some string'
我不知道的事:
Python 如何处理在 shell 中传递的非 ascii 字符串,知道这一点后,保存单词 "kožušček" 的正确方法是什么?
例如,我可以说
>>> s1 = 'kožušček'
在这种情况下,s1 变为 str 实例,我无法将其转换为 unicode:
>>> s1='kožušček'
>>> s1
'ko\x9eu\x9a\xe8ek'
>>> print s1
kožušček
>>> s1.decode('ascii')
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
s1.decode('ascii')
UnicodeDecodeError: 'ascii' codec can't decode byte 0x9e in position 2: ordinal not in range(128)
现在,我自然无法使用ascii 解码字符串,但我应该使用什么编码?毕竟,我的sys.getdefaultencoding() 返回ascii!当输入s1=kožušček 行时,Python 使用哪种编码来编码s1?
我的另一个想法是说
>>> s2 = u'kožušček'
但是,当我打印 s2 时,我得到了
>>> print s2
kouèek
这意味着 Python 丢失了一个完整的字母。谁能给我解释一下?
【问题讨论】:
-
您的意思是交互式解释器。它从
stdin流中读取,在此处进行编码的是您的控制台或终端。 -
能否具体说明您说的是python2还是python3?
-
@MadMike:这显然是 Python 2。
-
@MartijnPieters 尽管读者中的专家对此很清楚,但问题中仍应提及
标签: string unicode encoding utf-8 python-2.x