1. 程式人生 > >python總結(二):控制檯中文亂碼的解決辦法

python總結(二):控制檯中文亂碼的解決辦法

在編寫bash終端應用程式中,如果字串裡含有中文字元,可能會出現亂碼。

這裡以Win 10為例進行程式碼測試,utf8.py的內容如下:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
value = '蟻方陣'
print value

以Windows的CMD終端執行程式碼:

python utf8.py
# 輸出 鋩佹柟闃 亂碼

至於亂碼的原因,因為python檔案的編碼為UTF-8,而CMD終端的解碼格式為GBK,所以出現亂碼,詳細的分析過程見《JAVA總結(二):字元的編碼與解碼》

解決辦法很簡單,必須要以檔案的方式進行解碼,然後以輸出終端進行編碼,如下:

value = '蟻方陣'
print value.decode('UTF-8').encode('GBK')

現在控制端輸出終於正常,不過需要注意的是,不同的終端採用的解碼方式也不一樣,所以即使是在同一臺機器上,不同的終端也可能出現不同的結果,以我的測試為例,在MINGW64上,第一段程式碼輸出無亂碼,windows自帶CMD控制檯則出現亂碼,執行編碼與解碼過程後,則剛好相反。

除了上述的解決辦法,還可以直接在程式碼中寫入UTF-8字元,如下:

# '蟻方陣'的UTF-8編碼
value = ur'\u8681\u65B9\u9635'
# 對UTF-8終端正常
print
value.encode('UTF-8') # 對非UTF-8終端正常 print value

但是依舊存在上面的問題,對於輸出為UTF-8的終端顯示正常,對輸出為GBK編碼的終端則為亂碼,更有意思的是,上面的第二局輸出如果在UTF-8終端上進行測試,還直接報錯,如下:

Traceback (most recent call last):
  File "./utf8.py", line 3, in <module>
    print value
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0
-2: ordinal not in range(128)

結論

解決亂碼問題一定要依照輸入檔案(字元)的編碼與輸出顯示方式的解碼,只有掌握了它們之間的轉換關係,才能徹底解決亂碼。