2010-04-29 64 views
13

我對同一個項目使用了windows和linux機器。 windows上stdin的默認編碼是cp1252,在linux上是utf-8。如何更改Python上的stdin編碼

我想將所有內容都更改爲uft-8。 這可能嗎?我該怎麼做?

感謝 愛德華

回答

18

您可以通過打印東西的時候不依賴於隱式編碼做到這一點。在任何情況下都不依賴這是一個好主意 - 隱式編碼僅在打印到標準輸出以及標準輸出連接到終端時使用。

更好的方法是隨處使用unicode,並隨處使用codecs.opencodecs.getwriter。你在一個對象,使用自動編碼的Unicode字符串爲UTF-8包裹sys.stdout,例如:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout) 

,如果你使用unicode到處這隻會工作,雖然。所以,到處都要使用unicode。真的,到處都是。

+0

stdin呢? – duduklein 2010-04-29 20:25:09

+2

stdin不會被自動解碼,所以你必須自己做這件事。假設輸入是UTF-8可能不是一個好主意,但是如果你真的想的話,還有'codecs.getreader('utf-8')(sys.stdin)'。 – 2010-04-29 21:44:32

+0

請注意,與Python 2相比,Python 3實際上會自動解碼stdin:http://docs.python.org/3/library/sys.html#sys.stdin - 此行爲可以按照文檔中所述進行更改。 – 2014-02-08 18:00:47

12

這是一個老問題,但僅供參考。

讀取來自stdinUTF-8,使用:

UTF8Reader = codecs.getreader('utf8') 
sys.stdin = UTF8Reader(sys.stdin) 

# Then, e.g.: 
for _ in sys.stdin: 
    print _.strip() 

要寫入到UTF-8stdout,使用:

UTF8Writer = codecs.getwriter('utf8') 
sys.stdout = UTF8Writer(sys.stdout) 

# Then, e.g.: 
print 'Anything' 
6

Python的自動檢測標準輸入的編碼。我發現,當指定自動檢測工作不正常的編碼最簡單的方法是使用PYTHONIOENCODING環境變量,如下面的例子:

pipeline | PYTHONIOENCODING="UTF-8" /path/to/your-script.py 

有關編碼檢測的詳細信息,並在不同的這個變量平臺,你可以看看sys.stdin文檔。