我试图了解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'
答案 0 :(得分:7)
让我展开一下Ignacio的回复:在这两种情况下,Python和你之间都有一个额外的层:在一种情况下,它是 Sublime Text ,在另一种情况下它是cmd.exe
。您看到的行为差异不是由于Python,而是由 Sublime Text (utf-8,看起来像)和cmd.exe
(cp437)使用的不同编码。
因此,当您键入ñ
时, Sublime Text 会将'\xc3\xb1'
发送给Python,而cmd.exe
会发送\xa4
。 [我只是在这里,省略与问题无关的细节。]。
但是,Python知道这一点。从cmd.exe
你可能得到类似的东西:
>>> import sys
>>> sys.stdin.encoding
'cp437'
而在 Sublime Text 中你会得到像
这样的东西>>> import sys
>>> sys.stdin.encoding
'utf-8'
答案 1 :(得分:3)
解释器使用命令提示符的本机编码进行文本输入。在你的情况下它是CP437:
>>> print '\xa4'.decode('cp437')
ñ
答案 2 :(得分:0)
你会感到困惑,因为编辑和口译员自己使用不同的编码。 python解释器使用您的系统默认值(在本例中为cp437
),而编辑器使用utf-8
。
注意,如果指定unicode字符串,差异就会消失,如下所示:
# Windows python interpreter
>>> s = "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s = u"La caña de España"
>>> s
u'La ca\xf1a de Espa\xf1a'
故事的寓意?编码很棘手。确保您知道源文件的编码,或者始终使用特殊字符的转义版本来保证安全。