python unicode处理print和sys.stdout.write之间的差异

时间:2011-11-04 22:04:25

标签: python python-2.7 unicode stdout

我首先要说的是,我已经看过这篇文章:Strange python print behavior with unicode,但那里提供的解决方案(使用PYTHONIOENCODING)对我不起作用。

这是我的问题:

Python 2.6.5 (r265:79063, Apr  9 2010, 11:16:46)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
>>> a = u'\xa6'
>>> print a 
¦

工作正常,但是:

>>> sys.stdout.write(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa6' in position 0: ordinal not in range(128)

抛出错误。我在顶部链接的帖子表明这是因为默认的控制台编码是'ascii'。但是,就我而言,它不是:

>>> sys.stdout.encoding
'UTF-8'

那么关于这里有什么工作以及如何解决这个问题的想法呢?

由于 d。

1 个答案:

答案 0 :(得分:12)

这是由于python-2.7中存在fixed这个长期存在的错误,但为时已晚,无法反向移植到python-2.6。

文档说明当unicode字符串写入文件时,应使用file.encoding将它们转换为字节字符串。但这并没有被sys.stdout所尊重,而是使用了默认的unicode编码。这通常由site模块设置为“ascii”,但可以使用sys.setdefaultencoding进行更改:

Python 2.6.7 (r267:88850, Aug 14 2011, 12:32:40) [GCC 4.6.2] on linux3
>>> a = u'\xa6\n'
>>> sys.stdout.write(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec cant encode character u'\xa6' ...
>>> reload(sys).setdefaultencoding('utf8')
>>> sys.stdout.write(a)
¦

但是,更好的解决方案可能是用包装器替换sys.stdout

class StdOut(object):
    def write(self, string):
        if isinstance(string, unicode):
            string = string.encode(sys.__stdout__.encoding)
        sys.__stdout__.write(string)

>>> sys.stdout = StdOut()
>>> sys.stdout.write(a)
¦