python顯示中文亂碼的幾種情況encode decode

問題:最近在用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章