2017-01-13 74 views
0

我見過幾個與此相關的帖子,但沒有明確的答案。假設我想在僅支持ASCII的終端中打印字符串s=u'\xe9\xe1'(例如,LC_ALL=C; python3)。有什麼辦法來配置以下爲默認行爲:Python的默認字符編碼處理

import sys 
s = u'\xe9\xe1' 
s = s.encode(sys.stdout.encoding, 'replace').decode(sys.stdout.encoding) 
print(s) 

即,我想串打印的東西 - 即使是垃圾 - 而不是拋出一個異常(UnicodeEncodeError)。我正在使用python3.5。

我想避免編寫所有可能包含UTF-8的字符串。

回答

1

你可以做的三兩件事之一:

  • 調整錯誤處理程序stdoutstderrPYTHONIOENCODING environment variable

    export PYTHONIOENCODING=:replace 
    

    注意:;我沒有指定編解碼器,只有錯誤處理程序。

  • 更換stdoutTextIOWrapper,設置不同的錯誤處理程序:

    import sys 
    import io 
    
    sys.stdout = io.TextIOWrapper(
        sys.stdout.buffer, encoding=sys.stdout.encoding, 
        errors='replace', 
        line_buffering=sys.stdout.line_buffering) 
    
  • 創建圍繞sys.stdout.buffer單獨TextIOWrapper實例,並把它傳遞爲file參數打印時:

    import sys 
    import io 
    
    replacing_stdout = io.TextIOWrapper(
        sys.stdout.buffer, encoding=sys.stdout.encoding, 
        errors='replace', 
        line_buffering=sys.stdout.line_buffering) 
    
    print(s, file=replacing_stdout) 
    
+0

這正是我正在尋找的 - 非常感謝! (我選擇了2) – ws6079