GB2312、GBK、Unicode和UTF-8編碼介紹



漢字編碼知識點

    ASCII碼是西歐編碼的方式,採取7位編碼,所以是2^7=128,共可以表示128個自負,包括34個字符,(如換行LF,回車CR等),其餘94位爲英文字母和標點符號及運算符號等。在計算機中,一個ASCII碼佔8位,最高位(bit7)用作奇偶校驗。奇校驗規則:正確的代碼一個字節中1的個數必須是奇數,若非奇數,則在最高位b7補一個1;偶校驗規則:正確的代碼一個字節中1的個數必須是偶數,若非偶數,則在最高位b7補一個1。

    爲了識別雙字節的字符,比如漢字或日文韓文等都是佔用2個字節的,每字節高位爲1,而一般細紋字符只有一個字節,七位有效編碼,高位爲補位用,通常是0.漢字編碼格式通常稱爲10格式,一個漢字佔2個字節,但只表示一個字符。

一、GB2312編碼

    GB2312共收錄了6763個漢字,其中一級漢字3755個,二級漢字3008個,這裏的一級漢字和二級漢字是根據編碼的區位來區分的;另外,還收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄羅斯語西裏爾字母在內的682個全形字符。

    GB2312區位碼:

    GB2312對所收漢字進行了”區分“處理,美區含有94個漢字/符號。這種表示方式也稱爲區位碼。

    (1)01-09區爲特殊符號

    (2)16-55區爲一級漢字,按拼音排序

    (3)56-87區爲二級漢字,按部首/筆畫排序

    (4)10-15區及88-94區則未有編碼

    舉例來說,“啊”字是GB2312之中的第一個漢字,它的區位碼就是1601。字節編碼,通常採用EUC儲存方法,以便兼容於ASCII。每個漢字及符號以兩個字節來表示。 第一個字節稱爲“高位字節”,第二個字節稱爲“低位字節”。 “高位字節”使用了0xA1-0xF7(把01-87區的區號加上0xA0),“低位字節”使用了0xA1-0xFE(把01-94加上0xA0)。例如“啊”字在大多數程序中,會以0xB0A1儲存(與區位碼對比:0xB0=0xA0+16,0xA1=0xA0+1)。     

    所以GB2312編碼中漢字區碼的十進制是從176到247,位碼是從161到255.之所以存儲了6763小於82*94=6768,是因爲在區碼爲215,位碼爲250-254之間共五個編碼沒有漢字編碼,所以6768-5=6763個。  其編碼範圍:A1A1-FEFE,其中漢字的編碼範圍爲B0A1(十進制283159)-F7FE(十進制406662),第一字節0xB0-0xF7(對應區號:16-87),第二個字節0xA1-0xFE(對應位號:01-94)。

    GB2312編碼規則:

    (1)2字節編碼,高位爲0xA1-0xF7,低位爲0xA1-0xFE

    (2)漢字區域,高位爲0xB0-0xF7,低位爲0xA1-0xFE

    (3)特殊符號,高位爲0xA1-0xA9,低位爲0xA1-0xFE

二、GBK編碼 

    GB2312是中國規定的漢字編碼,也可以說是簡體中文的字符集編碼;而GBK是GB2312的擴展,除了兼容GB2312外,還包括了繁體中文和日文的假名等。

    GBK簡體字符集的編碼同時使用1個字節和2個字節,當高位是0x00~0x7f時,爲一個字節,高位爲0x80以上時用2個字節表示。當發現一個字節的內容大於0x7f時,那它肯定是個漢字(跟另一個字節拼湊成一個漢字),0x7f(01111111)接下來的數就是0x80(10000000),所以想要大於0x7f,這個字節的最高位都肯定是1,我們之需要判斷這個最高位是否爲1就行了。例如:a的ASCII碼是97(01100001),A的ASCII碼是65(01000001).

三、Unicode編碼

    Unicode是由國際組織設計的一種字符編碼方法,可以容納全世界所有語言文字的編碼方案。Unicode的學名叫”UniversalMultipleOctetCoded Character Set“,簡稱爲UCS。Unicode規定了如何編碼,但是沒有規定如何傳輸、保存這個編碼。例如”漢“字的UCS編碼是6C49,我們可以用4個ASCII數字來傳輸、保存這個編碼;也可以使用utf-8編碼,3個連續的字節E6B189來表示他。關鍵在於通信雙方都要認可。UTF-8、UTF-7、UTF-16都是被廣泛接受的方案。UTF-8的一個特別好友是它與ISO-8859-1完全兼容。UTF是”UCSTransformation Format“的縮寫。

    UTF-8是Unicode的一種實現方式,也就是它的字節結構有特殊要求,所以我們說一個漢字的範圍是0X4E00到0x9FA5,是指unicode值,至於放在utf-8的編碼裏去就是由三個字節來組織,所以可以看出unicode是給出一個字符的範圍,定義了這個字是碼值是多少,至於具體的實現方式可以有多種多樣來實現。對於某一個字符的UTF-8編碼,如果只有一個字節則其最高二進制位爲0;如果是多字節,其第一個字節從最高位開始,連續的二進制位值爲1的個數決定了其編碼的位數,其餘各字節均以10開頭。UTF-8最多可用到6個字節。

    漢字的unicode範圍是:0x4E00~0x9FA5,UTF-8有點類似於Haffman編碼,是一種變長的編碼方式,儘可能的縮短編碼後的字節數大小,它將Unicode編碼爲:

        0x00-0x7F的字符,用單個字節來表示;

        0x80-0x7FF的字符用兩個字節表示;

        0x800-0xFFFF的字符用3字節表示;

        一直持續到6個字節,依次類推。

Unicode符號範圍 | UTF-8編碼方式

(十六進制) | (二進制)

--------------------+---------------------------------------------

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx10xxxxxx

0000 0800-0000 FFFF | 1110xxxx10xxxxxx 10xxxxxx

0001 0000-0010 FFFF | 11110xxx10xxxxxx 10xxxxxx 10xxxxxx

    如:“嚴”的unicode編碼是4E25(100111000100101),根據上表,可以發現4E25處在第三行的範圍內(00000800-0000 FFFF),因此“嚴”的UTF-8編碼需要三個字節,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然後,從“嚴”的最後一個二進制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,“嚴”的UTF-8編碼是“1110010010111000 10100101”,轉換成十六進制就是E4B8A5。

    所以當我們需要在GB2312、GBK等和UTF-8之間轉換時,必須依賴Unicode碼才能實現。

    GB2312GBK-----Unicode-----UTF-8

    UTF-8-------Unicode-----GB2312GBK

 

參考資料

    1漢字Unicode大全http://mall.webcrow.jp/

 

發佈了210 篇原創文章 · 獲贊 202 · 訪問量 171萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章