需要使用中文就輸入中文,大多數情況下應該是用不著的。
首先,Python3內部str采用Unicode編碼,不是UTF-8編碼。Unicode是字符編碼,UTF-8是字符傳輸編碼(當然也用于文件存儲),二者不是一個概念。在Unicode出現之前,字符編碼和字符傳輸編碼沒有區別,比如ASCII,GBK、BIG5等等。Unicode編碼不用于直接傳輸或存儲,對應于Unicode的傳輸編碼有UTF-8、UTF-16、UTF-32等多種格式,通常采用UTF-8編碼,在Unicode編碼小于256時,與ASCII編碼完全一致,兼容性好,而且傳輸量也比UTF-16、UTF-32要小。
在Python2時代,Python的str對象是簡單的字節流,默認ASCII編碼,無法直接打印非ASCII字符,unicdoe對象內部采用Unicode編碼,才支持非ASCII字符打印。對于非ASCII字符需要decode()指定編碼轉換unicode,輸出時encode()轉換為具體傳輸編碼,用于顯示、保存、傳輸。
Python3時代,str對象內部采用unicode實現,相當于Python2的unicode對象,同時用bytes對象來表示原始的字節流也就是原始的傳輸或者存儲的字節。Python3默認的傳輸和存儲字節流是UTF-8編碼,也就是說,不指定原始字節流編碼的情況下,Python3自動按照UTF-8解碼原始字節流,并自動轉換為Unicode字符編碼用于內部處理。同樣,輸出時如果不指定編碼,也會自動轉換為UTF-8編碼格式(不一定正確,再某些系統上,Python會檢測運行環境的編碼,自動轉換為環境的默認編碼)。
因此,Python3強烈建議,在傳輸和存儲時都采用UTF-8編碼,這樣就無需考慮字符編碼的問題。
為了與其他系統或者軟件兼容,Python3同樣提供了decode()、encode()函數用于Unicode與其他傳輸編碼的轉換。并且,對open()函數增加了encoding參數,用于非UTF-8編碼的文件讀寫的支持。
所以,你要清楚的是,原始數據文件的編碼格式。如果是UTF-8編碼,使用Python3時無需考慮編碼問題。如果是GB2312、GBK等那么就有兩種方式,一是指定encoding參數打開,得到的str對象;或者以二進制,即mode參數指定'b',得到bytes對象,再decode()解碼,轉換為unicode對象。