有人可以向我解释这个奇怪的事情:
在python shell中时,我键入以下西里尔字母字符串:
>>> print 'абвгд'
абвгд
但是当我键入:
>>> print u'абвгд'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128)
由于第一个问题正确地出现了,我认为我的OS X终端可以代表unicode,但是事实证明在第二种情况下它不能代表unicode。为什么 ?
最佳答案
>>> print 'абвгд'
абвгд
当您输入某些字符时,终端将决定如何将这些字符表示给应用程序。您的终端可能会将字符编码为utf-8,ISO-8859-5或什至只有您的终端才能理解的东西提供给应用程序。 Python将这些字符作为字节序列来获取。然后python将这些字节原样打印出来,然后您的终端以某种方式解释它们以显示字符。由于终端通常以与以前编码相同的方式解释字节,因此所有内容都会像您键入时一样显示。
>>> u'абвгд'
在这里,您输入一些字符,这些字符以字节序列的形式到达python解释器,可能由终端以某种方式进行编码。使用
u
前缀,python会尝试将此数据转换为unicode。为了正确地做到这一点,python必须知道您的终端使用什么编码。在您的情况下,Python似乎猜测您的终端编码为ASCII,但是接收到的数据与此不匹配,因此您会遇到编码错误。因此,在交互式 session 中创建unicode字符串的直接方法将是这样的:
>>> us = 'абвгд'.decode('my-terminal-encoding')
在文件中,您还可以使用特殊模式行指定文件的编码:
# -*- encoding: ISO-8859-5 -*-
us = u'абвгд'
对于其他设置默认输入编码的方法,您可以查看
sys.setdefaultencoding(...)
或sys.stdin.encoding
。关于Mac OS X终端机中的Python unicode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/918294/