關于字符的編碼,這是一個及其重要的知識點,這個點不搞清楚,那改bug有時候你會暈的。我們下面就以Python為例來說說字符編碼的問題。
我們常見的編碼格式有ASCII、gbk、GB2312、UTF-8、GB18030和Unicode等等。
說明一下:
ASCII 隻能表示英文和部分字符,占用1個字節
那問題來了,在我們中國,怎麼表示中文呢?于是就有了下面的三種編碼。
GB2312 中文編碼,好像隻能存7000多個漢字
GB18030 中文編碼,好像能存2萬多個漢字
GBK 中文編碼,基本上表示所有的漢字,windows系統默認的其實就是這個編碼。
那問題繼續來了,那每個國家都有自己的一套編碼,那不是買了他國的設備,顯示不出本國的字符了?
于是乎,就有了ISO标準的萬國碼-------Unicode。
Unicode :就是所謂的萬國碼。他能顯示全球各個地方的字符了。它1個中文字符或者一個英文字符占2字節。
要說這個Unicode好啊 ,都能存儲了,可是問題又來了,我本身英文的字符我是用ASCII編碼,隻占用8bit,現在用你的Unicode要占用16bit。這不是扯了蛋了。使用英文字符的就不願意了,要知道内存還是很貴的。這就出現了UTF-8。
UTF-8: 在Unicode的基礎上出現了這種編碼,UTF-8被稱作可變長編碼。可以認為是Unicode的一個擴展集,英文字符占用1個字節,中文占用3個字節。
有了這麼多種編碼,那麼編碼的轉換就是一個很必然的問題了。
字符編碼與轉換看一個很重要的圖:
我們舉個例子,假如現在要把韓國的一個軟件運行在我們的機器上,假如這個軟件使用的是x編碼,我們知道不經過處理肯定是跑不起來的,這就需要一個轉碼的過程,這個過程是:x編碼------>Unicode------>GBK。必須要有這個過程。x編碼------>Unicode 這個過程一般稱為解碼(decode),Unicode------>GBK這個過程稱為編碼(encode)。反之,我們也需要這樣一個過程。總之,轉碼的過程Unicode成了一個橋梁,轉化成Unicode的過程一般稱為decode。
在我們的python3中所有的編碼都為utf-8。在python2中為ASCII。可使用該指令查詢:
我們以python3x為例來說明一下:
這是我的pycharm的界面,注意右下角的編碼格式為:UTF-8,這個表示我的這個程序使用的是UTF-8編碼。
而在左側輸出欄裡面的UTF-8表示的python3使用的默認編碼是UTF-8。
我們把pycharm右下角的編碼格式改為GBK。
寫個簡單的字符串,同志們報錯了啊。這是為啥呢?我們先改一下再看:
第一張圖為啥報錯了呢?其實也很容易理解了,python3默認UTF-8編碼,你現在把你的python文件設置為GDK編碼,那肯定報錯啊。但是我要是在程序的前面,
# -*-coding:gbk -*-
我們聲明一下,我們使用gbk,程序就好了。這也是為啥我們在python2的時候開頭總有這個設置文件編碼的語句了。
那麼問題來了,這個s是什麼編碼呢?其實這個s還是unicode編碼。因為我們使用的是python3的解釋器,默認的還是unicode或者叫做utf-8。這個# -*-coding:gbk -*-隻是設置了你的文件的編碼格式。它和運行的時候毛的關系都沒有。這也是此時你不能再decode的原因了,我本身就是unicode,肯定就不能decode了。
我們來對s這個字符串編碼一下:以gbk的格式啊
是不是又有疑問了?gbk編碼竟然顯示不出來這個字符串了,什麼鬼?
其實這個是一個以byte類型編碼gbk,顯示不了這個字符串了。這個也是python3才有的。
在普及一下:Python 3對字符串和二進制數據流做了明确的區分。Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隐式的方式混用str和bytes,你不能拼接字符串和字節流,也無法在字節流裡搜索字符串(反之亦然),也不能将字符串傳入參數為字節流的函數(反之亦然)。
以utf-8的格式編碼一下s
依舊還是顯示不出來字符串,顯示的是以utf-8編碼的“我愛你”這個字符串。
以gb2312的格式編碼一下s
看看這個gb2312和gbk的編碼是不是一樣的,那是必然了,都是中文編碼嘛,可以認為gb2312是gbk的一個子集。
我們再來看看decode和encode的語法格式:
encode:後面跟的參數是我要編碼成的格式,例如:encode(“gbk”),表示我要編碼成gbk格式。
decode:後面跟的參數是我現在的格式,例如:decode(“gbk”)表示我要将gbk編碼的東西解碼成unicode。
我們在轉回字符串,讓它顯示“我愛你”
就說這麼多了,有啥問題歡迎大家留言交流。
更多内容請關注頭條号:小5嵌入式
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!