[英]Writing unicode strings via sys.stdout in Python
假設一個人不能使用print
(從而享受自動編碼檢測的好處)。 所以這給我們留下了sys.stdout
。 但是, sys.stdout
是如此愚蠢,以至於沒有做任何合理的編碼 。
現在,您可以閱讀Python維基頁面PrintFails並嘗試以下代碼:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout);
然而,這也不起作用(至少在Mac上)。 太明白為什么:
>>> import locale
>>> locale.getpreferredencoding()
'mac-roman'
>>> sys.stdout.encoding
'UTF-8'
(UTF-8是終端理解的)。
所以將上面的代碼更改為:
$ python -c 'import sys, codecs, locale; print str(sys.stdout.encoding); \
sys.stdout = codecs.getwriter(sys.stdout.encoding)(sys.stdout);
現在unicode字符串被正確發送到sys.stdout
,因此在終端上正確打印( sys.stdout
附加到終端)。
這是在sys.stdout
編寫unicode字符串的正確方法,還是我應該做其他事情?
編輯 :有時 - 比如說,當輸出到less
- sys.stdout.encoding
將是None
。 在這種情況下,上面的代碼將失敗。
export PYTHONIOENCODING=utf-8
將完成這項工作,但無法在python本身設置它...
我們可以做的是驗證是否設置並告訴用戶在調用腳本之前設置它:
if __name__ == '__main__':
if (sys.stdout.encoding is None):
print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout."
exit(1)
最好的辦法是檢查您是否直接連接到終端。 如果是,請使用終端的編碼。 否則,請使用系統首選編碼。
if sys.stdout.isatty():
default_encoding = sys.stdout.encoding
else:
default_encoding = locale.getpreferredencoding()
始終允許用戶指定她想要的編碼也非常重要。 通常我將它作為命令行選項(如-e ENCODING
),並使用optparse
模塊解析它。
另一個好處是不要用自動編碼器覆蓋sys.stdout
。 創建編碼器並使用它,但不要單獨使用sys.stdout
。 您可以導入將編碼的字節串直接寫入sys.stdout
第三方庫。
存在可選的環境變量“PYTHONIOENCODING”,其可以被設置為期望的默認編碼。 這將是以與所有Python一致的方式獲取用戶期望的編碼的一種方式。 它被埋葬在Python手冊這里 。
這就是我在我的應用程序中所做的事情:
sys.stdout.write(s.encode('utf-8'))
這是從argv讀取UTF-8名稱的完全相反的修復:
for file in sys.argv[1:]:
file = file.decode('utf-8')
這是非常難看的(恕我直言),因為它迫使你使用UTF-8 ..這是Linux / Mac上的常態,但不是在Windows上......無論如何都適合我:)
我不清楚為什么你不能打印; 但假設是這樣,是的,這種方法對我來說是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.