中文字元集簡介(GB2312 GB13000(GBK) GB18030)

來源:互聯網
上載者:User
轉貼者註:  GB2312在1980年由國家頒布, GB13000(GBK) 是對GB2312的擴充且完全相容前者,GB18030包括GB18030-2000和GB18030-2005. 其中GB2312和GB13000(GBK)都是兩位元組的,GB18030為多位元組。

0 碼位空間0.1 約定

GBK是雙位元組編碼,每個字元用兩個位元組表示。GB18030是多位元組字元集,它的字元可以用一個、兩個或四個位元組表示。碼位空間由各位元組的範圍確定。例如:GB18030的四位元組字元碼位空間是:

  • 第一位元組在0x81~0xFE之間
  • 第二位元組在0x30~0x39之間
  • 第三位元組在0x81~0xFE之間
  • 第四位元組在0x30~0x39之間

為了表述方便,我們用0x81308130~0xFE39FE39表示這個碼位空間。也就是說:在本文中0x81308130~0xFE39FE39所指的並是從0x81308130到0xFE39FE39的連續2097773834(0xFE39FE39-0x81308130+1)個位元組。在本文中,0x81308130~0xFE39FE39所指的是編碼的各位元組在對應範圍內的碼位空間,這個碼位空間的碼位元目是:

(0xFE-0x81+1)*(0x39-0x30+1)*(0xFE-0x81+1)*(0x39-0x30+1)=126*10*126*10=1587600

同理,0xB0A1~0xF7FE代表的碼位空間是第一位元組在0xB0~0xF7之間,第二位元組在0xA1~0xFE之間的所有碼位。這個碼位空間的碼位元目是:

(0xF7-0xB0+1)*(0xFE-0xA1+1)=72*94=6768

這個碼位空間就是GBK和GB18030的2區,在這6768個碼位中定義了6763個字元。

本文用~表示上述碼位空間,用-表示一般的範圍,即:

  • 0xA1A1~0xA9FE
    表示第一位元組在0xA1到0xA9之間,第二位元組在0xA1~0xFE之間的846((0xA9-0xA1+1)*(0xFE-0xA1+1)=9*94)個碼位。
  • 0xE000-0xF8FF 表示從0xE000-0xF8FF的連續6400(0xF8FF-0xE000+1)個碼位。

0.2 習題

讀者如果已經理解了上面的約定,請完成下面兩個習題:

  1. 習題一:求碼位空間0x8140~0xFE7E的碼位元目。
  2. 習題二:求碼位空間0x8180~0xFEFE的碼位元目。
0.3 答案

以下是習題0.2的答案:

  1. 習題一:(0xFE-0x81+1)*(0x7E-0x40+1)=126*63=7938
  2. 習題二:(0xFE-0x81+1)*(0xFE-0x80+1)=126*127=16002

GB18030雙位元組字元的碼位空間就是0x8140~0xFE7E和0x8180~0xFEFE,雙位元組字元的碼
位元目是7938+16002=23940。0x8140~0xFE7E和0x8180~0xFEFE也是GBK的全部碼位空間。GBK在這23940個
碼位中定義了21886個字元。

1 GBK回顧1.1 簡介

GBK是雙位元組編碼方案。它的碼位空間就是前面所說的0x8140~0xFE7E和0x8180~0xFEFE,一共23940個碼位。在這23940個碼位上定義了21886個字元,包括21003個漢字和883個圖形符號。《Unicode、GB2312、GBK和GB18030中的漢字》詳細討論了這21003個漢字。本文的第3節會討論GB2312、GBK和GB18030的圖形符號。

GBK的碼位空間可以劃分為以下地區:

類別 區名 碼位範圍 碼位元 字元數
符號區 1區 0xA1A1~0xA9FE 846 717
5區 0xA840~0xA97E和0xA880~0xA9A0 192 166
漢字區 2區 0xB0A1~0xF7FE 6768 6763
3區 0x8140~0xA07E和0x8180~0xA0FE 6080 6080
4區 0xAA40~0xFE7E和0xAA80~0xFEA0 8160 8160
使用者自訂區 使用者區1 0xAAA1~0xAFFE 564  
使用者區2 0xF8A1~0xFEFE 658  
使用者區3 0xA140~0xA77E和0xA180~0xA7A0 672  
1.2 GBK字元與Unicode的映射

我製作了一個Excel檔案:附件1。這個檔案包含3張表格:

  1. 按照GBK編碼排序的GBK全部21886字元碼錶。這個表格有3列:字元、GBK編碼、Unicode編碼。
  2. 按照Unicode編碼排序的GBK全部21886字元碼錶。這個表格有3列:字元、Unicode編碼、GBK編碼。

  3. 按Unicode編碼排序的表格中,很容易找到被映射到PUA(0xE000-0xF8FF)的字元。GBK的21886個字元中有95個字元屬於
    PUA。第三張表格列出了這95個字元(A列)的GBK編碼(B列)、Unicode編碼(C列)以及這些字元在GB18030中對應的Unicode編
    碼(D列)。
    其中D列可能不太容易理解,我再解釋一下。GB18030是相容GBK的,所以這些字元的GBK編碼和GB18030編碼是相同的。
    例如的GBK編碼和GB18030編碼都是0xA8BF。但是在GBK和GB18030中,被映射到不同的Unicode碼位。在GBK中,
    0xA8BF被映射到Unicode的0xE7C8。在Unicode中,碼位0xE7C8是一個PUA碼位,保留給使用者使用。在GB18030中,
    0xA8BF被映射到Unicode的0x01F9。在Unicode中,碼位0x01F9屬於“拉丁字母擴充-B”這個Block,這個碼位定義的字元
    是“帶抑音符的拉丁文小寫字母 N”,字形就是。
1.3 GBK碼位與Unicode的映射

GBK的23940個碼位定義了21886個字元,還有23940-21886=2054個空閑碼位,這2054個
碼位都被映射到Unicode的PUA。在設計GBK時,GBK的21886個字元中有95個在Unicode中沒有對應字元,所以這95個字元也被映射
到Unicode的PUA。在GBK的23940個碼位中,一共有2054+95=2149個碼位被映射到PUA,對應的PUA編碼是0xE000-
0xE864。0xE000-0xE864就是2149個碼位。這2149個碼位的分配有以下規律:

碼位所在地區 碼位元量 映射到的PUA範圍
使用者區1:0xAAA1~0xAFFE 564 0xE000-0xE233
使用者區2:0xF8A1~0xFEFE 658 0xE234-0xE4C5
使用者區3:0xA140~0xA77E和A180-A7A0 672 0xE4C6-0xE765
符號區(1區和5區)的170個空閑碼位 170 0xE766-0xE80F
2區的5個空閑碼位:0xD7FA-0xD7FE 5 0xE810-0xE814
4區的80個Unicode當時沒有定義的字元:FE50-FE7E和FE80-FEA0 80 0xE815-0xE864

附件2包含兩張表格:

  1. 23940個GBK碼位與Unicode的映射。兩組資料分別按GBK和Unicode排序。
  2. 2149個映射到PUA的碼位,按Unicode順序排列。
2 GB18030編碼2.1 概述

GB18030是多位元組字元集,它的字元可以用一個、兩個或四個位元組表示。GB18030的碼位定義如下:

位元組數 碼位空間 碼位元 字元數
單位元組 0x00~0x7F 128 128
雙位元組 0x8140~0xFE7E和0x8180~0xFEFE 23940 21897
四位元組 0x81308130~0xFE39FE39 1587600 54531

GB18030有128+23940+1587600=1611668個碼位。Unicode的碼位元目是0x110000(1114112),少於GB18030。所以,GB18030有足夠的空間映射Unicode的所有碼位。

GB18030的1611668個碼位目前定義了128+21897+54531=76556個字元。Unicode
5.0定義了99089個字元。

2.2 設計思路

GB18030編碼可以分為:單位元組部分、雙位元組部分和四位元組部分。單位元組部分與Unicode的0x00-0x7f完全相同。雙位元組部分與GBK有兩點差異:

  1. 在1區增加了11個字元。這樣1區就有717+11=728個字元。增加的11個字元是:一個歐元符號(0xA2E3)和10個豎排標點符號(0xA6D9-0xA6DF、0xA6EC-0xA6ED和0xA6F3)。
  2. 原來因為Unicode沒有收錄而映射到PUA的字元中的部分字元被新版本的Unicode收錄,所以將這些字元對應表到非PUA的碼位。

Unicode的BMP一共有65536個碼位。其中代理區(0xD800-0xDFFF)有2048個碼位,這
2048個碼位是不能定義字元的。GB18030的單位元組部分映射了128個碼位,GB18030的雙位元組部分映射了23940個碼位。還剩下65536
-2048-128-23940=39420個碼位。

GB18030將這39420個碼位順序映射到從0x81308130開始的碼位空間。GB18030將
Unicode的16個輔助平面(0x10000-0x10FFFF,一共1048576個碼位)順序映射到從0x90308130開始的碼位空間。
GB18030四位元組部分中只有這兩個地區定義了字元,其它空間都是保留區和自訂區。本文的第3節和第4節還會詳細討論GB18030的雙位元組和四位元組
部分。

GB18030的設計思路可以概括到以下幾點:

  1. 單位元組部分與Unicode一致。
  2. 雙位元組部分與GBK相容。適當調整一些字元與Unicode的映射。這些字元原來因為Unicode沒有收錄而被映射到PUA,現在因為Unicode已經收錄而調整到非PUA的Unicode碼位。
  3. 將Unicode BMP部分還沒有映射的39420個碼位順序映射到從0x81308130開始的四位元組部分。
  4. 將Unicode BMP以外的16個輔助平面映射到39420個碼位順序映射到從0x90308130開始的四位元組部分。

在GB18030目前定義的76556個字元中,只有24個字元被定義到Unicode的PUA區。這24個字元包
括1區的10個豎排標點符號(0xA6D9-0xA6DF、0xA6EC-0xA6ED和0xA6F3)和4區的14個漢字(0xFE51、
0xFE52、0xFE53、0xFE59、0xFE61、0xFE66、0xFE67、0xFE6C、0xFE6D、0xFE76、0xFE7E、
0xFE90、0xFE91、0xFEA0)。4區的14個漢字在Unicode 5.0中其實也可以找到非PUA的編碼,詳見《Unicode、GB2312、GBK和GB18030中的漢字》。但按照GB18030,它們還是應該映射到PUA碼位。

2.3 GB18030-2000和GB18030-2005的區別及以後版本

GB18030-2005與GB18030-2000的編碼體繫結構是完全相同的。GB18030-2005相對於GB18030-2000主要有以下變化:

  1. 在四位元組字元表中增加CJK統一漢字擴充B和已經在GB13000中編碼的我國少數民族文字字元的字形。其實GB18030-2000已經映射了這些碼位,但GB18030-2000沒有給出這些字元的字形。
  2. 調整字元的編碼。

其中的編碼調整比較有意思。的GB18030編碼是0xA8BC,在Unicode
5.0的編碼是0x1E3F。在GB18030-2000中0xA8BC被映射到Unicode的0xE7C7,因為雙位元組部分沒有映射0x1E3F,所
以它作為BMP的未映射字元被放到四位元組部分的0x8135F437。GB18030-2005將0xA8BC映射到0x1E3F,那麼Unicode碼
位0xE7C7怎麼辦呢?為了最小化對原來編碼的影響,設計者將Unicode碼位0xE7C7映射到本來映射0x1E3F的0x8135F437。

GB18030已經映射了Unicode的所有碼位,所以不管Unicode怎麼變化,GB18030不過就是在現在的碼位上增加一些字形而已,編碼不會變化。只有現在還映射到PUA的24個字元以後可能會調整到非PUA碼位。調整方法應該與的調整方法相同。

2.4 GB18030雙位元組部分

前面已經介紹過GB18030雙位元組部分與GBK的區別,本小節再提一些細節。前面也說過,GB18030映射了
Unicode除代理區外的所有碼位。所以,Unicode
BMP的6400個PUA碼位在GB18030中都有對應的碼位。GB18030雙位元組部分映射了2067個PUA碼位。

前面說過,GBK映射了2149個PUA碼位。現在GB18030雙位元組部分映射了2067個PUA碼位。所以有
2149-2067=82個字元的映射發生了變化。GBK原來有95個字元對應表到PUA,其中81個字元在GB18030中被映射到非PUA碼位。餘下的
14個漢字就是《Unicode、GB2312、GBK和GB18030中的漢字》提到的那14個漢字(0xFE51、0xFE52、0xFE53、0xFE59、0xFE61、0xFE66、0xFE67、0xFE6C、0xFE6D、0xFE76、0xFE7E、0xFE90、0xFE91、0xFEA0)。附件1列出了這些字元的編碼變化。82個映射變化的碼位,除了這81個外,還有一個就是歐元符號:GB18030編碼是0xA2E3,Unicode編碼是0x20AC。碼位0xA2E3在GBK中被映射到0xE76C,GBK的碼位0xA2E3沒有定義字元。

GB18030雙位元組部分與Unicode的映射沒有規律,只能通過查表方法映射。

2.5 GB18030四位元組部分

GB18030四位元組部分的字元可以見GB18030-2005的“表3
四位元組部分的碼位安排”,一共54531個字元。GB18030四位元組部分的碼位可以見GB18030-2005的“7.3
四位元組部分字元的排列順序”。其中定義字元的只有兩個地區:

  • GB18030用碼位0x81308130~0x8439FE39共50400個碼位映射該標準單位元組和雙位元組部分沒有映射過的39420個Unicode
    BMP碼位。
  • GB18030用碼位0x90308130~0xE339FE39共1058400個碼位映射Unicode
    16個輔助平面(平面1到平面16)的65536*16=1048576個碼位。

為了敘述方便,本文將0x81308130~0x8439FE39稱作“BMP擴充部分”,將
0x90308130~0xE339FE39稱作“輔助平面部分”。GB18030四位元組部分的碼位空間是0x81308130~0xFE39FE39。
第二位元組有(0x39-0x30+1)=10個可能值。第三位元組有(0xFE-0x81+1)=126個可能值。第四位元組也是(0x39-0x30+1)
=10個可能值。為了方便下面的演算,本文為這個碼位空間定義幾個名詞:

  • 我們將四位元組碼位空間中第一位元組相同的地區稱作一級區。每個一級區有12600個碼位,即:10*126*10。
  • 我們將四位元組碼位空間中第一位元組和第二位元組相同的地區稱作二級區。每個二級區有1260個碼位,即:126*10。
  • 我們將四位元組碼位空間中前三個位元組相同的地區稱作三級區,每個三級區有10個碼位。

四位元組部分一共有(0xFE-0x81+1)=126個一級區。BMP擴充部分有4個一級區。輔助平面部分有84個一級區。還有38個一級區是保留區或自訂區。

2.5.1 BMP擴充部分

BMP擴充部分佔據四位元組部分開頭的4個一級區,一共有4*12600=50400個碼位。這段空間的
Unicode映射說起來還是很簡單的,就是順序映射單位元組、雙位元組沒有映射過的BMP碼位。這些映射關係在GB18030-2000中確定下來。以後的
調整(例如)只是個別字元,不會影響其它字元的位置。但是因為雙位元組字元已經映射過的BMP碼位沒有什麼規律,所以造成BMP擴充部分的Unicode
映射也不能用公式換算,還是要查表解決。

顯然這50400個碼位中只用到了39420個碼位,其餘碼位都是保留的。出於好玩,我們來計算一下最後一個非保留碼位(0xFFFF)的位置,計算過程如下:

  • m1=(39420-1)/12600=3
  • n1=(39420-1)%12600=1619
  • m2=n1/1260=1619/1260=1
  • n2=n1%1260=1619%1260=359
  • m3=n2/10=359/10=35
  • n3=n2%10=359%10=9
  • 第一位元組的位置是:0x81+m1=0x81+3=0x84
  • 第二位元組的位置是:0x30+m2=0x30+1=0x31
  • 第三位元組的位置是:0x81+m3=0x81+35=0xA4
  • 第四位元組的位置是:0x30+n3=0x30+9=0x39

所以Unicode編碼0xFFFF映射的GB18030碼位是0x8431A439。在BMP擴充部分中,0x8431A439以後的碼位都是保留碼位。上述計算中,/表示整除(例如5/3=1),%表示取餘(例如5%3=2)。

2.5.2 輔助平面部分

輔助平面部分用84個一級區(0x90308130~0xE339FE39)直接映射Unicode的16個輔助平面。這部分映射是可以直接用公式計算的。讓我們看看怎麼計算。

  • 從Unicode編碼到GB18030編碼的映射方法如下:

    • U=Unicode編碼-0x10000
    • m1=U/12600
    • n1=U%12600
    • m2=n1/1260
    • n2=n1%1260
    • m3=n2/10
    • n3=n2%10
    • 第一位元組b1=m1+0x90
    • 第二位元組b2=m2+0x30
    • 第三位元組b3=m3+0x81
    • 第四位元組b4=n3+0x30


    照上述方法可以計算出0x10FFFF被映射到0xE3329A35。在輔助平面部分,0xE3329A35以後的碼位都是保留碼位。以上所寫的演算法可以
    很容易寫成C/C++代碼。對於不會編程的讀者,也可以用Excel公式計算。假設Unicode編碼放在儲存格A12,計算方法如下:

    • 將m1放在B12,B12=INT((HEX2DEC(A12)-65536)/12600)
    • 將n1放在C12,C12=MOD((HEX2DEC(A12)-65536),12600)
    • 將m2放在D12,D12=INT(C12/1260)
    • 將n2放在E12,E12=MOD(C12,1260)
    • 將m3放在F12,F12=INT(E12/10)
    • 將n3放在G12,G12=MOD(E12,10)
    • 將第一位元組放在H12,H12=DEC2HEX(B12+144)
    • 將第二位元組放在I12,I12=DEC2HEX(D12+48)
    • 將第三位元組放在J12,J12=DEC2HEX(F12+129)
    • 將第四位元組放在K12,K12=DEC2HEX(G12+48)

    附件3中有寫好上述公式的Excel表格。使用函數HEX2DEC/DEC2HEX需要通過“工具->載入宏”鉤上“分析工具庫”。

  • 從GB18030編碼到Unicode編碼的映射方法如下:
    • 設GB18030編碼的四個位元組依次為:b1、b2、b3、b4,則
      Unicode編碼=0x10000+(b1-0x90)*12600+(b2-0x30)*1260+(b3-0x81)*10+b4-0x30

    假設b1、b2、b3、b4分別放在A4、B4、C4、D4,Unicode編碼放在E4,則Excel計算公式為:

    • E4 =
      =DEC2HEX((HEX2DEC(A4)-144)*12600+(HEX2DEC(B4)-48)*1260+(HEX2DEC(C4)-129)*10+(HEX2DEC(D4)-48)+65536)
2.6 GB18030和Unicode的映射表

附件3給出了GB18030和Unicode的映射表。這個Excel檔案是在網友謝振斌先生的映射表基礎上製作的,包含3張表格:

  1. 雙位元組部分23940個碼位與Unicode的映射。兩組資料分別按GB18030和Unicode排序。
  2. BMP擴充部分39420個碼位與Unicode的映射。兩組資料分別按GB18030和Unicode排序。
  3. 輔助平面部分,GB18030編碼和Unicode編碼的映射公式。
3 GB2312、GBK和GB18030中的圖形符號

在研究GB18030編碼的過程中,我整理了GB2312、GBK和GB18030在1區和5區的圖形符號,製作了附件4。這個Excel檔案包含3張表格:

  1. GB2312的1區字元表。GBK和GB18030的1區、5區字元表。用不同顏色標註了GBK增加的35個字元和GB18030增加的11個字元。
  2. GB2312 1區682個符號的編碼。
  3. GBK 1區717個符號的編碼。
結束語

通過本文的介紹,讀者可以回答開頭的問題了嗎?

無論是Windows
XP還是Vista,中文(中國)地區對應的預設字碼頁還是GBK。我們只能設定地區,並不能設定地區對應的預設字碼頁。所以在Windows世界,只要
微軟不願意,GB18030就只是一張普通的字碼頁。目前的簡體中文文檔使用的編碼主要是Unicode和GBK,應該沒有什麼文檔會用GB18030保
存。本文只是出於程式員的好奇而對GB18030編碼所作的一些研究,希望能對同樣好奇的讀者有所助益。

  document.write("");
//window.onload = function(){ dp.SyntaxHighlighter.ClipboardSwf =
'http://hi2.images.csdn.net/flash/syntaxhighlighter/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code'); //} LoadFeedbackCount(); ad_width=468; ad_height=60; adcss=2;
unionuser=19; tags=''; ad_type='j'; count=2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.