Python Unicode字符串和Python交互式解释器

gui*_*ooo 4 python string unicode sublimetext

我试图理解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'
Run Code Online (Sandbox Code Playgroud)

kra*_*oti 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'
Run Code Online (Sandbox Code Playgroud)

而在Sublime Text中,你会得到类似的东西

>>> import sys
>>> sys.stdin.encoding
'utf-8'
Run Code Online (Sandbox Code Playgroud)

  • 我在 SublimeText 中得到“None”,而:“print sys.stdin.encoding”在空闲时我得到了运行 Mac OS X 的“UTF-8” (2认同)