关于twisted输出log时候的unicode编码异常问题
May 17th, 2009 by skysbird
在使用twisted的application模式编程的时候,往往会用到twisted的log系统。该系统会将stdout重载,加入自己的机制,然而该机制对于unicode字符串的编码有一些问题。
比如在程序中print了一条string
s = u’中文’
print s
也许会很惊奇的得到下面这个异常
exceptions.UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 60: ordinal not in range(128) 这个异常是因为 当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(这仅是个人猜测)。 在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。 在程序的入口处,设置默认python编码,方法如下: import sys reload(sys) sys.setdefaultencoding('gbk')