漢字編碼之GBK編碼
何為GBK,何為GB2312,與區位碼有何淵源?
區位碼是早些年(1980)中國製定的一個編碼標準,如果有玩過小霸王學習機的話,應該會記得有個叫做“區位”的輸入法(沒記錯的話是按F4選擇)。就是打四個數字然後就出來漢字了,什麼原理呢。請看下面的區位碼錶,每一個字元都有對應一個編號。其中前兩位為“區”,後兩位為“位”,中文漢字的編號區號是從16開始的,位號從1開始。前面的區號有一些符號、數字、字母、注音符號(臺)、製表符、日文等等。
而GB2312編碼就是基於區位碼的,用雙位元組編碼表示中文和中文符號。一般編碼方式是:0xA0+區號,0xA0+位號。如下表中的 “安”,區位號是1618(十進位制),那麼“安”字的GB2312編碼就是 0xA0+16 0xA0+18 也就是 0xB0 0xB2 。根據區位碼錶,GB2312的漢字編碼範圍是0xB0A1~0xF7FE
繼續字元編碼的學習。今天介紹一下GBK(漢字內碼擴充套件規範),GB 2312 GB18030。引用網友的話可以概括一下:
GBK和UTF8的區別:GBK就是在儲存你的帖子的時候,一個漢字佔用兩個位元組。。外國人看會出現亂碼,此為我中華為自己漢字編碼而形成之解決方案。
UTF8就是在儲存你的帖子的時候,一個漢字佔用3個位元組。。但是外國人看的話不會亂碼,此為西人為了解決多位元組字元而形成之解決方案。
GBK——專門為解決漢字的編碼而生成的解決方案。
那麼,一個漢字究竟被儲存為什麼,就需要:先查unicode碼錶,然後根據在碼錶的位置進行計算。例如:“電”字,在碼錶中是3575,計算成utf8就是E794B5,而在GB2312的碼錶中為B5E7。
GBK的中文編碼是雙位元組來表示的,英文編碼是用ASC||碼錶示的,既用單位元組表示。但GBK編碼表中也有英文字元的雙位元組表示形式,所以英文字母可以有2種GBK表示方式。為區分中文,將其最高位都定成1。英文單位元組最高位都為0。當用GBK解碼時,若高位元組最高位為0,則用ASC||碼錶解碼;若高位元組最高位為1,則用GBK編碼表解碼。
編碼方式:
字元有一位元組和雙位元組編碼,00–7F範圍內是第一個位元組,和ASCII保持一致,此範圍內嚴格上說有96個文字和32個控制符號。之後的雙位元組中,前一位元組是雙位元組的第一位。總體上說第一位元組的範圍是81–FE(也就是不含80和FF),第二位元組的一部分領域在40–7E,其他領域在80–FE。具體來說,定義的是下列位元組:
範圍 | 第1位元組 | 第2位元組 | 編碼數 | 字數 |
---|---|---|---|---|
水準GBK/1 | A1 –A9 |
A1 –FE |
846 | 717 |
水準GBK/2 | B0 –F7 |
A1 –FE |
6,768 | 6,763 |
水準GBK/3 | 81 –A0 |
40 –FE (7F 除外) |
6,080 | 6,080 |
水準GBK/4 | AA –FE |
40 –A0 (7F 除外) |
8,160 | 8,160 |
水準GBK/5 | A8 –A9 |
40 –A0 (7F 除外) |
192 | 166 |
使用者定義 | AA –AF |
A1 –FE |
564 | |
使用者定義 | F8 –FE |
A1 –FE |
658 | |
使用者定義 | A1 –A7 |
40 –A0 (7F 除外) |
672 | |
合計: | 23,940 | 21,886 |
雙位元組符號可以表達的64K空間如下圖所示。綠色和黃色區域是GBK的編碼,紅色是使用者定義區域。沒有顏色區域是不正確的程式碼組合:
要點總結
GBK編碼是GB2312編碼的超集,向下完全相容GB2312。
GB18030編碼向下相容GBK和GB2312,
GBK、GB2312等與UTF8之間都必須通過Unicode編碼才能相互轉換。
GBK,GB2312以及Unicode都既是字符集,也是編碼方式,而UTF-8只是編碼方式,並不是字符集
參考技術部落格【點選】
GBK 碼錶 【點選轉載處】
轉自:https://www.cnblogs.com/batsing/p/charset.html
https://blog.csdn.net/hherima/article/details/50801360