繁体   English   中英

Mac OS X终端中的Python unicode

[英]Python unicode in Mac os X terminal

有人可以向我解释这个奇怪的事情:

在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,但事实证明在第二种情况下它不能。 为什么呢

>>> print 'абвгд'
абвгд

当您输入某些字符时,终端将决定如何将这些字符表示给应用程序。 您的终端可能会将字符编码为utf-8,ISO-8859-5或什至只有您的终端才能理解的字符。 Python将这些字符作为字节序列来获取。 然后python将这些字节原样打印出来,然后您的终端以某种方式解释它们以显示字符。 由于您的终端通常以与以前编码相同的方式解释字节,因此所有内容都会像您键入时一样显示。

>>> u'абвгд'

在这里,您输入一些字符,这些字符以字节序列的形式到达python解释器,可能由终端以某种方式进行编码。 使用u前缀,python会尝试将此数据转换为unicode。 为了正确地做到这一点,python必须知道您的终端使用什么编码。 在您的情况下,Python似乎猜测您的终端编码为ASCII,但是接收到的数据与此不匹配,因此您会遇到编码错误。

因此,在交互式会话中创建unicode字符串的直接方法是这样的:

>>> us = 'абвгд'.decode('my-terminal-encoding')

在文件中,您还可以使用特殊模式行指定文件的编码:

# -*- encoding: ISO-8859-5 -*-
us = u'абвгд'

有关设置默认输入编码的其他方法,请查看sys.setdefaultencoding(...)sys.stdin.encoding

从Python 2.6开始,您可以使用环境变量PYTHONIOENCODING告诉Python您的终端支持UTF-8。 使其永久保存的最简单方法是在您的~/.bash_profile添加以下行:

export PYTHONIOENCODING=utf-8

Terminal.app显示Python的unicode输出

除了确保将OS X终端设置为UTF-8外,您可能还希望将python sys默认编码设置为UTF-8或更高。 /Library/Python/2.5/site-packages创建一个名为sitecustomize.py的文件。 在此文件中放入:

import sys
sys.setdefaultencoding('utf-8')

setdefaultencoding方法仅由站点模块可用,并且在启动完成后将从sys命名空间中删除。 这样,您将需要启动一个新的python解释器以使更改生效。 您可以在启动后随时使用sys.getdefaultencoding()验证当前的默认编码。

如果字符还不是unicode,则需要转换它们,请对字符串使用decode方法,以便将其他字符集的文本解码为unicode ...最好指定哪个字符集:

s = 'абвгд'.decode('some_cyrillic_charset') # makes the string unicode
print s.encode('utf-8') # transform the unicode into utf-8, then print it

另外,请确保将终端编码设置为Unicode / UTF-8(而不是ascii,这似乎是您的设置):

http://www.rift.dk/news.php?item.7.6

unicode对象需要先编码才能在某些控制台上显示。 尝试

u'абвгд'.encode()

而是将unicode编码为字符串对象(最有可能使用utf8作为默认编码,但取决于您的python配置)

'абвгд'不是Unicode字符串

u'абвгд'是一个unicode字符串

如果不对unicode字符串进行编码,则无法打印它们。 当您在应用程序中处理字符串时,您要确保所有输入均已解码且所有输出均已编码。 这样,您的应用程序将仅在内部处理unicode字符串,并在UTF8中输出字符串。

以供参考:

>>> 'абвгд'.decode('utf8') == u'абвгд'
>>> True

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM