2010-01-03 79 views
2

我用一個匿名管道來捕獲所有的stdout,然後stderr打印成一個richedit,當我使用wsprintf時沒關係,但是使用多字節字符串的python真的讓我煩惱。我怎樣才能將所有這些輸出轉換爲unicode?python和unicode stderr

更新2010-01-03:

謝謝你的回覆,但似乎str.encode()只有print xxx東西的工作,如果是py_runxxx()過程中出現錯誤,我重定向標準錯誤將捕獲錯誤多字節字符串中的消息,那麼有沒有辦法可以使Python以unicode的方式輸出它的消息?在this post似乎有一個可用的解決方案。

我稍後再試。

回答

0

您可以使用Unicode在python中使用Unicode標記字符串(即:u'Hello World')或使用所有字符串具有的encode()方法。

例如,假設你有一個Unicode字符串,aStringVariable:

aStringVariable.encode('utf-8') 

將其轉換爲UTF-8。 'utf-16'會給你UTF-16,'ascii'會將它轉換爲普通的舊ASCII字符串。

欲瞭解更多信息,請參見:

+0

1.在這種情況下,隱藏內建名稱('str()')是一種糟糕的做法。應該在Unicode字符串上調用'.encode()'而不是在字節串上調用。 – jfs 2010-01-03 19:48:04

+0

這對變量名來說只是一個不好的選擇。我已經把它變成了更明顯的東西。 – 2010-01-03 22:24:43

-1

wsprintf

這似乎是一個「C/C++」的問題,而不是Python的問題。

Python解釋器總是將bytestrings寫入stdout/stderr,而不是unicode(或「wide」)字符串。這意味着Python首先使用當前編碼編碼所有Unicode數據(可能爲sys.getdefaultencoding())。

如果你想獲得stdout/stderr作爲unicode數據,你必須使用正確的編碼來解碼它。

你最喜歡的C/C++庫肯定有它需要做的。

9

首先,請記住在Windows控制檯上可能不完全支持Unicode。下面

的例子確實使蟒輸出stderrstdout使用UTF-8到。如果你想要,你可以改變它到其他編碼。

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

不錯!儘管在我的情況下替換stdout和stderr不是必需的。 – flocki 2014-07-08 15:50:32