python總結(二):控制檯中文亂碼的解決辦法
阿新 • • 發佈:2019-01-09
在編寫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)
結論
解決亂碼問題一定要依照輸入檔案(字元)的編碼與輸出顯示方式的解碼,只有掌握了它們之間的轉換關係,才能徹底解決亂碼。