我试图了解 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'

故事的道德?编码是棘手。一定要知道什么编码的源文件中,还是明哲保身通过始终使用的特殊字符转义版本。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top