簡體   English   中英

在Python中通過sys.stdout編寫unicode字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM