Python与Unicode标准错误输出
我用一个匿名管道来捕捉所有的标准输出和错误输出,然后把它们打印到一个富文本编辑器里。用wsprintf的时候没问题,但Python使用的是多字节字符,这让我很烦。有没有办法把这些输出转换成Unicode格式呢?
更新 2010-01-03:
谢谢你的回复,但似乎str.encode()
只对print xxx
的内容有效。如果在py_runxxx()
过程中出现错误,我重定向的错误输出会捕捉到多字节字符串的错误信息。那么有没有办法让Python以Unicode的方式输出信息呢?在这篇帖子中似乎有一个可行的解决方案。
我稍后会试试。
3 个回答
wsprintf
是什么?
这个问题看起来更像是关于“C/C++”的,而不是Python。
Python解释器总是将字节字符串写入标准输出(stdout)和标准错误(stderr),而不是直接写入Unicode(或称为“宽”)字符串。这意味着Python会先用当前的编码方式(通常是sys.getdefaultencoding()
)把所有的Unicode数据转换成字节。
如果你想把标准输出或标准错误当作Unicode数据来处理,你需要自己用正确的编码方式进行解码。
你喜欢的C/C++库肯定有办法做到这一点。
在Python中,你可以通过将字符串标记为Unicode(比如:u'Hello World'
)或者使用所有字符串都有的encode()方法来处理Unicode。
举个例子:假设你有一个Unicode字符串,叫做aStringVariable:
aStringVariable.encode('utf-8')
这个方法会把它转换成UTF-8格式。如果你用'utf-16',就会得到UTF-16格式,而'ascii'则会把它转换成普通的ASCII字符串。
想了解更多信息,可以查看:
首先,请记住,在Windows的命令行中,可能不完全支持Unicode字符。
下面的例子展示了如何让Python使用UTF-8格式输出到stderr
和stdout
。如果你想的话,可以把它改成其他编码格式。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import codecs, sys
reload(sys)
sys.setdefaultencoding('utf-8')
print sys.getdefaultencoding()
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)
print "This is an Е乂αmp١ȅ testing Unicode support using Arabic, Latin, Cyrillic, Greek, Hebrew and CJK code points."