“ 代碼都是寫給人看的,計算機隻識别0、1二進制數據。”
正如昨天從字符編碼的背景說起,說到了字符集。今天我們就接着說說字符編碼,以及以“國”字為例,來說說字符編碼,解碼的過程。
01
—
字符編碼
字符編碼是一套法則,使用該法則能夠對自然語言的字符的一個集合(如字母表或音節表),與其他東西的一個集合(如号碼或電脈沖)進行配對。即在符号集合與數字系統之間建立對應關系,它是信息處理的一項基本技術。換句話說:字符編碼就是将符号轉換為計算機可以接受的數字系統的數,稱為數字代碼。
字符集 |
字符編碼 |
ASCII |
ASCII |
ISO-8859-1 |
ISO-8859-1 |
GB2312 |
GB2312 |
GBK |
GBK |
Unicode |
UTF-8,UTF-16,UTF-32 |
從第一篇中的截圖也能看出,一個字符集,其實就是數字地址和其對應文字、符号之間對應關系。字符集本身就有字符編碼的功能。下來重點要說下UTF-8。
由于Unicode對某些字符來說,占用字節太多,太浪費空間。所以,人們設計可變長的UTF-8編碼規則來節省存儲空間。UTF-8一種針對Unicode的可變長度字符編碼(定長碼),也是一種前綴碼。它可以用來表示Unicode标準中的任何字符,且其編碼中的第一個字節仍與ASCII兼容。
UTF-8的編碼規則很簡單,隻有二條:
第一,對于單字節的符号,字節的第一位設為0,後面7位為這個符号的Unicode碼。因此對于英語字母,UTF-8編碼和ASCII碼是相同的。
第二,對于n字節的符号(n>1),第一個字節的前n位都設為1,第n 1位設為0,後面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符号的Unicode碼。
02
—
一個示例
下來,我們做一個示例。用來形象的展現下,文本編碼之間的轉換關系。還是用我們中國的“國”字來舉例:由于是中文,那麼這個“國”字,肯定在ASCII碼裡面不存在的;在ISO-8859-1裡面也不存在的。
我們來看看“國”字在GBK裡面的地址:從上面的截圖能看到16進制地址是:B9FA。轉換成2進制,就是10111001 11111010。而B9FA在Unicode字符集裡面是一個朝鮮文。
而這一串二進制10111001 11111010 不符合UTF-8編碼規則,所以在UTF-8裡面找不到對應字符。
而“國”字在Unicode裡面的字符16進制地址是:56FD。轉成二進制:00000000,00000000,01010110,11111101
那麼這個二進制,如果用UTF-8實現的話,邏輯應該是怎麼樣的呢?這個二進制串,有15位。那麼在UTF-8裡面用幾個字節來存放呢?
第一步:将上面二進制數據從低往高按照UTF-8規則來一位一位存放。
第二步:繼續從低往高存放位數據:
第三步結束後發現,在UTF-8裡面,3個字節就可以存儲下對應的Unicode中的“國”字。
如上圖,灰色,表示UTF-8規則,第一個字節,3個1,表示有3個字節。第3 1位為0。淡紅色的0表示高位補0。綠色表示Unicode編碼用UTF-8編碼實現的數據位。
也就是這個二進制,111001011001101110111101。轉換為16進制後為:E59BBD
校驗:我們通過網絡工具,來查看下,“國”字UTF-8編碼的二進制,如下圖:
UTF-8編碼轉16進制,如下圖:
可見,二進制,16進制,和我們自己推算出來的結果完全一緻。
而如果用E59BBD地址,反過來在GBK字符集裡面查找的話,确是什麼都查找不到的。
由于GBK字符集總共有23940個碼位。其中收錄漢字和圖形符号21886個。而E59BBD 10進制數字為:15047613。遠遠超過23940這個數字。故此,用E59BBD在GBK裡面查找對應内容,肯定什麼都查不到。
回到文首說的“新聞”=>“鏂伴椈”這個問題,就很容易解釋了。“新聞” 兩個字UTF-8編碼16進制數據為:“E696B0 E997BB”。在UTF-8轉換成GBK編碼過程中,由于GBK是雙字節編碼,所以,上述16進制數據變成3個字符“E696”、“B0E9”、“97BB”。而這三個字符,在GBK字符集中對應的字符就是“鏂”、“伴”、“椈”。所以就會表現出切換編碼格式後,“新聞” 變成 “鏂伴椈” 這種表象。
經過這一番分析,舉例。我們對什麼是ASCII,什麼是GBK,什麼是Unicode,什麼是UTF-8可能了解的更清晰,更透徹一些了。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!