python和unicode stderr

时间:2010-01-03 06:21:22

标签: python unicode stderr

我使用匿名管道捕获所有stdout,然后stderr打印到richedit,当我使用wsprintf时它没关系,但使用多字节char的python真的让我烦恼。如何将所有这些输出转换为unicode?

更新2010-01-03:

感谢您的回复,但似乎str.encode()仅适用于print xxx内容,如果在py_runxxx()期间出现错误,我的重定向stderr将捕获错误消息多字节字符串,所以有没有办法可以让python以unicode方式输出它的消息?在this post中似乎有一个可用的解决方案。

我稍后会尝试。

3 个答案:

答案 0 :(得分:9)

首先,请记住,在Windows控制台上可能不完全支持Unicode。

下面的示例确实使用 UTF-8 将python输出到stderrstdout。如果您愿意,可以将其更改为其他编码。

#!/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."

答案 1 :(得分:0)

您可以通过将字符串标记为Unicode(即:u'Hello World')或使用所有字符串都具有的encode()方法在python中使用Unicode。

例如。假设你有一个Unicode字符串,aStringVariable:

aStringVariable.encode('utf-8')

会将其转换为UTF-8。 'utf-16'将为您提供UTF-16,'ascii'将其转换为普通的旧ASCII字符串。

有关详细信息,请参阅:

答案 2 :(得分:-1)

wsprintf

这似乎是一个“C / C ++”问题而不是Python问题。

Python解释器总是将字节串写入stdout / stderr,而不是unicode(或“wide”)字符串。这意味着Python首先使用当前编码对所有unicode数据进行编码(可能是sys.getdefaultencoding())。

如果您想将stdout / stderr作为unicode数据获取,则必须使用正确的编码自行解码。

您最喜欢的C / C ++库肯定能够做到这一点。