1. 程式人生 > 實用技巧 >漢字編碼之GBK編碼

漢字編碼之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。具體來說,定義的是下列位元組:

GBK的編碼範圍
範圍第1位元組第2位元組編碼數字數
水準GBK/1 A1A9 A1FE 846 717
水準GBK/2 B0F7 A1FE 6,768 6,763
水準GBK/3 81A0 40FE(7F除外) 6,080 6,080
水準GBK/4 AAFE 40A0(7F除外) 8,160 8,160
水準GBK/5 A8A9 40A0(7F除外) 192 166
使用者定義 AAAF A1FE 564
使用者定義 F8FE A1FE 658
使用者定義 A1A7 40A0(7F除外) 672
合計:23,94021,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