Python Unicode字符串和Python交互式解释器
我试图了解python
2.5如何处理unicode字符串。尽管到目前为止,我认为我已经很好地理解了如何在代码中处理它们,但是我还不完全了解幕后的情况,尤其是当您在解释程序的提示符下键入字符串时。
因此python pre
3.0有两种字符串类型,即:(str
字节字符串)和unicode
,这两种类型均源自basestring
。字符串的默认类型是str
。
str
对象没有实际编码的概念,它们只是字节。您是自己编码了unicode字符串,因此知道了它们的编码方式,或者您已经读取了一个字节流,而这些字节的编码您也已经事先知道(理想情况下)。您可以猜测一个字节字符串的编码,该字节字符串的编码对您来说是未知的,但是没有一种可靠的方法可以解决此问题。最好的选择是尽早解码,在代码中的任何地方使用unicode,然后再进行后期编码。
没关系。但是,键入解释器的字符串确实是为您背后编码的吗?如果我对Python中的字符串的理解是正确的,那么python用于做出此决定的方法/设置是什么?
我困惑的根源是在系统的python安装和编辑器的嵌入式python控制台上尝试相同的操作时得到的结果不同。
# Editor (Sublime Text)
>>> s = "La caña de España"
>>> s
'La ca\xc3\xb1a de Espa\xc3\xb1a'
>>> s.decode("utf-8")
u'La ca\xf1a de Espa\xf1a'
>>> sys.getdefaultencoding()
'ascii'
# Windows python interpreter
>>> s= "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s.decode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 5: unexpected code byte
>>> sys.getdefaultencoding()
'ascii'
-
让我扩展一下Ignacio的回答:在这两种情况下,Python和您之间都有一个额外的层:一种情况是 Sublime Text
,另一种情况是cmd.exe
。您看到的行为差异不是由于Python引起的,而是由于 Sublime Text
(看起来是utf-8)和cmd.exe
(cp437)使用的不同编码。因此,当您输入时
ñ
, Sublime Text
发送'\xc3\xb1'
到Python,而cmd.exe
sends发送\xa4
。[我只是在这里讨价还价,省略了与问题无关的细节。]不过,Python知道这一点。从
cmd.exe
您可能会得到类似:>>> import sys >>> sys.stdin.encoding 'cp437'
而在 Sublime Text中, 您会得到类似
>>> import sys >>> sys.stdin.encoding 'utf-8'