問題:最近在用vscode進行python編寫的代碼輸除中文的時候出現亂碼
一、VSCODE無法顯示中文的問題
顯示漢字亂碼,類似下面這些情況:
str = '中文'
print(str)
print(str.encode('utf-8'))
print(str.encode('gbk'))
輸出:
解決方法:菜單Debug->Open Configurations,打開launch.json
"env":{ "PYTHONIOENCODING":"gbk" }
二、python中文亂碼問題
排除IDE環境影響,而又出現亂碼的情況,是因爲:
一般情況下window默認編碼gbk,linux默認編碼utf8。正常我們的輸出如下:
#-*-coding:utf-8 -*-
str = '中文'
print(str)
print(str.encode('utf-8'))
print(str.encode('gbk'))
正確輸出:
python編程中:系統編碼,python編碼,文件編碼的概念。
(1)系統編碼:默認寫源碼的編輯器的編碼方式。它代表源碼文件內的所有內容都是根據詞方式編碼成二進制碼流。存入到磁盤中的。linux下通過locale命令查看。
(2)python編碼:指python內設置的解碼方式。如果不設定的話,python默認的是ascii解碼方式。如果python源代碼文件中不出現中文的話,這個地方怎麼設定應該不會問題。
設定方法:在源碼文件開頭(一定是第一行):#--coding:UTF-8--,源碼文件的設置解碼方式是UTF-8
三、具體分析
一般情況下輸出亂碼的原因就是沒有按照系統解碼的方式進行編碼。
第一種:讀取文件的字符,出現亂碼原因:
如果文件內容用utf-8的編碼保存的源文件。但是windows的本地默認編碼是cp936,也就是gbk編碼,所以在控制檯直接打印utf-8的字符串當然是亂碼了。
解決方法:
在控制檯打印的地方用一個轉碼就ok了,打印的時候這麼寫:
print(myname.decode('utf-8').encode('gbk'))
第二種:python 使用ctypes調用動態庫,輸出漢字字符:
dll調用的情況:
比如定義結構體輸出結果是char license[PLATE_NAME_MAX];
,這時候要顯示信息有漢字字符,則要加decode:
print("plate number :", djPDVarOut.license.decode('gbk'))
再舉例來說:
比如print(s), s類型爲str,linux系統下系統默認編碼爲utf8編碼,s在輸出前就應該編碼爲utf8。如果s爲gbk編碼就應該這樣輸出。print(s.decode(‘gbk’).encode(‘utf8’))才能輸出中文。
第三種:就是直接給一個字符型數據,進行decode會報錯。
decode針對的是以下類型的數據(倒數兩行),而且一定要有**‘b’**
如果沒有b就會被當做是str,則不能用decode,只能encode
另外:直接輸出也是會出錯,不管數據是gbk還是utf-8編碼輸入
解決辦法:用raw_unicode_escape編碼,給帶上b符號
str_without_b = '\xe4\xb8\xad\xe6\x96\x87'
str = str_without_b.encode('raw_unicode_escape')
print('raw_unicode_escape 編碼後:',str)
print('再用utf-8解碼:',str.decode('utf-8'))
第四種:先用gbk編碼encode,再用utf-8解碼decode,會報錯
因爲gbk編碼後的格式,無法用utf-8解碼,可能越界。(我猜的)
整理的比較亂,最後給出幾個參考鏈接:
https://www.cnblogs.com/dinghanhua/p/9933000.html
https://blog.csdn.net/joyfixing/article/details/79971667
https://blog.csdn.net/frozleaf/article/details/95304096
https://www.cnblogs.com/weixliu/p/3550642.html