2007-06-27

 

Python Cookbook 1.22 输出Unicode字符到标准输出

需求:

需要输出unicode字符串到标准输入(如:用于调试),可是默认的编码不能满足需求.

讨论:

用一个转换器来封装sys.stdout流,我们可以使用Python的codec类库.举例说明,我们希望输出编码是ISO-8859-1的unicode字符,可以这样写:

import codecs, sys
sys.stdout = codecs.lookup('iso8859-1')[-1]( sys.stdout)

unicode存在于一个很大的空间中,让它足以容纳世界上任何字符,由于unicode设计分离了内部表示和用户使用方式,所以我们可以很方便的使用它.然而,对于文件流来说,比如sys.stdout,需要考虑编码的每一个字节.你可以改变它默认的编码方式,通过修改模块site.可以这样的话,你就修改了整个Python的安装,会影响到别的Python程序,也许它们需要使用Python的默认编码格式(ASCII),因此,这种方式的修改是不可取的.
本节给出了一个方法:重新绑定sys.stdout流,让它接收Unicode,而提供ISO-8859-1输出.这里,我们首先保存原来的sys.stdout引用:

>>> old = sys.stdout

接下来,我们创建一个Unicode字符串,在正常情况下,它是不能被正确输出的:

>>> char = u"\N{LATIN SMALL LETTER A WITH DIAERESIS}"
>>> print char
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeError: ASCII encoding error: ordinal not in range(128)

如果在这一步你没有获得这样的错误,那是因为Python认为它自己知道你使用的终端的编码类型.可是如果你得到了这样的错误,或者得到的结果不是你期望的,比如你的终端使用UTF-8而Python并不知道这一点.遇到这种情况,我们用codec里面的UTF-8来封装sys.stdout:

>>> sys.stdout = codecs.lookup('utf-8')[-1](sys.stdout)
>>> print char
ä

当然,还需要你使用的终端支持utf-8编码,如果没有的话,可以从网上免费下载一个.
Python使用sys.stdout.encoding来判断终端的编码,因为IDLE和交互式Python界面,它们总是封装sys.stdout的,所以你可以输出unicode字符.

相关说明:

codecs.lookup(...)
    lookup(encoding) -> (encoder, decoder, stream_reader, stream_writer)
   
    Looks up a codec tuple in the Python codec registry and returns
    a tuple of functions.

标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?