Python Unicode 字符串和 Python 交互式解释器
-
19-09-2019 - |
题
我试图了解 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'
解决方案
让我扩展伊格纳西奥的答复:在这两种情况下,Python 和您之间都有一个额外的层:在一种情况下是 崇高的文字 另一个是 cmd.exe
. 。您看到的行为差异不是由于 Python 造成的,而是由于使用的不同编码造成的 崇高的文字 (utf-8,看起来)和 cmd.exe
(cp437)。
所以,当你输入 ñ
, 崇高的文字 发送 '\xc3\xb1'
对于Python,而 cmd.exe
发送 \xa4
. 。[我只是简单地在这里,省略与问题无关的细节。]。
不过,Python 知道这一点。从 cmd.exe
你可能会得到类似的东西:
>>> import sys
>>> sys.stdin.encoding
'cp437'
而在之内 崇高的文字 你会得到类似的东西
>>> import sys
>>> sys.stdin.encoding
'utf-8'
其他提示
在解释器使用了文本输入命令提示符的本地编码。你的情况是CP437:
>>> print '\xa4'.decode('cp437')
ñ
您会因为编辑器和解释器使用不同的编码自己感到困惑。 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'
故事的道德?编码是棘手。一定要知道什么编码的源文件中,还是明哲保身通过始终使用的特殊字符转义版本。