2014-06-11 41 views
3

我寫了一個小腳本,基本上在Windows終端(它使用希臘cp737代碼頁)打印一些信息。它本質上是某事像這樣:Python 3優雅的方式打印二進制輸出到終端

while True: 
    title = u'greek and other unichars follow:\t{}'.format(unicode_input()) 
    print title.encode('cp737','ignore') 

,輸出:

greek and other unichars follow: Καλημέρα! 

其工作方式最希臘字母的預期,終端打印和忽略罕見的例外,它們不能被翻譯成更多的約束cp737。

現在python3打印字節,像你當 「unitext」 .encode(),輸出到stdout字節對象的原樣「:

b"greek and other unichars follow:\t\x89\x98\xa2\x9e\xa3\xe2\xa8\x98!" 
  • 印刷在終端直接UNICODE最終將導致一個 UnicodeEncode錯誤。

  • 轉換unicode - > bytes(cp737,ignore) - > unicode,看起來很古怪。

那麼這樣做的優雅方式是什麼?

回答

2

對於Python 3,你有幾個選項供您選擇:

  1. 設置PYTHONIOENCODING環境變量到終端的編碼。例如,您可以將其設置爲PYTHONIOENCODING=cp737:ignore。然後,如果您使用print打印Unicode文本,它將自動轉換爲cp737字符集並正確輸出。
  2. 在運行時重置sys.stdout的編碼。看到這個問題:How to set sys.stdout encoding in Python 3?
  3. 直接寫入編碼的字節到sys.stdout.buffer,它繞過sys.stdout使用的編碼機制。
+0

鏈接的答案使用'codecs.getwriter';你也可以'分離'並用另一個'io.TextIOWrapper'封裝緩衝區。 – eryksun

+0

sys.stdout.buffer.write(字節)更接近我所尋找的。 它也是[文檔](docs.python.org/3/library/sys.html#sys.stdout)(雖然'可能適用的限制') 一些討論:bugs.python.org/issue18512 –