中文字符集簡(jiǎn)介(GB2312GB13000(GBK)GB18030)_第1頁(yè)
中文字符集簡(jiǎn)介(GB2312GB13000(GBK)GB18030)_第2頁(yè)
中文字符集簡(jiǎn)介(GB2312GB13000(GBK)GB18030)_第3頁(yè)
中文字符集簡(jiǎn)介(GB2312GB13000(GBK)GB18030)_第4頁(yè)
中文字符集簡(jiǎn)介(GB2312GB13000(GBK)GB18030)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

中?字符集簡(jiǎn)介(GB2312GB13000(GBK)GB18030)轉(zhuǎn)貼者注:GB2312在1980年由國(guó)家頒布,GB13000(GBK)是對(duì)GB2312的擴(kuò)充且完全兼容前者,GB18030包括GB18030-2000和GB18030-2005.其中GB2312和GB13000(GBK)都是兩字節(jié)的,GB18030為多字節(jié)。0碼位空間0.1約定GBK是雙字節(jié)編碼,每個(gè)字符?兩個(gè)字節(jié)表?。GB18030是多字節(jié)字符集,它的字符可以??個(gè)、兩個(gè)或四個(gè)字節(jié)表?。碼位空間由各字節(jié)的范圍確定。例如:GB18030的四字節(jié)字符碼位空間是:第?字節(jié)在0x81~0xFE之間第?字節(jié)在0x30~0x39之間第三字節(jié)在0x81~0xFE之間第四字節(jié)在0x30~0x39之間為了表述?便,我們?0x81308130~0xFE39FE39表?這個(gè)碼位空間。也就是說(shuō):在本?中0x81308130~0xFE39FE39所指的并不是從0x81308130到0xFE39FE39的連續(xù)2097773834(0xFE39FE39-0x81308130+1)個(gè)字節(jié)。在本?中,0x81308130~0xFE39FE39所指的是編碼的各字節(jié)在對(duì)應(yīng)范圍內(nèi)的碼位空間,這個(gè)碼位空間的碼位數(shù)?是:(0xFE-0x81+1)*(0x39-0x30+1)*(0xFE-0x81+1)*(0x39-0x30+1)=126*10*126*10=1587600同理,0xB0A1~0xF7FE代表的碼位空間是第?字節(jié)在0xB0~0xF7之間,第?字節(jié)在0xA1~0xFE之間的所有碼位。這個(gè)碼位空間的碼位數(shù)?是:(0xF7-0xB0+1)*(0xFE-0xA1+1)=72*94=6768這個(gè)碼位空間就是GBK和GB18030的2區(qū),在這6768個(gè)碼位中定義了6763個(gè)字符。本??~表?上述碼位空間,?-表??般的范圍,即:0xA1A1~0xA9FE表?第?字節(jié)在0xA1到0xA9之間,第?字節(jié)在0xA1~0xFE之間的846((0xA9-0xA1+1)*(0xFE-0xA1+1)=9*94)個(gè)碼位。0xE000-0xF8FF表?從0xE000-0xF8FF的連續(xù)6400(0xF8FF-0xE000+1)個(gè)碼位。0.2習(xí)題讀者如果已經(jīng)理解了上?的約定,請(qǐng)完成下?兩個(gè)習(xí)題:1.習(xí)題?:求碼位空間0x8140~0xFE7E的碼位數(shù)?。2.習(xí)題?:求碼位空間0x8180~0xFEFE的碼位數(shù)?。0.3答案以下是習(xí)題0.2的答案:1.習(xí)題?:(0xFE-0x81+1)*(0x7E-0x40+1)=126*63=79382.習(xí)題?:(0xFE-0x81+1)*(0xFE-0x80+1)=126*127=16002GB18030雙字節(jié)字符的碼位空間就是0x8140~0xFE7E和0x8180~0xFEFE,雙字節(jié)字符的碼位數(shù)?是7938+16002=23940。0x8140~0xFE7E和0x8180~0xFEFE也是GBK的全部碼位空間。GBK在這23940個(gè)碼位中定義了21886個(gè)字符。1GBK回顧1.1簡(jiǎn)介GBK是雙字節(jié)編碼?案。它的碼位空間就是前?所說(shuō)的0x8140~0xFE7E和0x8180~0xFEFE,?共23940個(gè)碼位。在這23940個(gè)碼位上定義了21886個(gè)字符,包括21003個(gè)漢字和883個(gè)圖形符號(hào)。詳細(xì)討論了這21003個(gè)漢字。本?的第3節(jié)會(huì)討論GB2312、GBK和GB18030的圖形符號(hào)。GBK的碼位空間可以劃分為以下區(qū)域:類別區(qū)名碼位范圍碼位數(shù)字符數(shù)符號(hào)區(qū)1區(qū)0xA1A1~0xA9FE8467175區(qū)0xA840~0xA97E和0xA880~0xA9A0192166漢字區(qū)2區(qū)0xB0A1~0xF7FE676867633區(qū)0x8140~0xA07E和0x8180~0xA0FE608060804區(qū)0xAA40~0xFE7E和0xAA80~0xFEA081608160?戶?定義區(qū)?戶區(qū)10xAAA1~0xAFFE564?戶區(qū)20xF8A1~0xFEFE658?戶區(qū)30xA140~0xA77E和0xA180~0xA7A06721.2GBK字符與Unicode的映射我制作了?個(gè)Excel?件:。這個(gè)?件包含3張表格:1.按照GBK編碼排序的GBK全部21886字符碼表。這個(gè)表格有3列:字符、GBK編碼、Unicode編碼。2.按照Unicode編碼排序的GBK全部21886字符碼表。這個(gè)表格有3列:字符、Unicode編碼、GBK編碼。3.從按Unicode編碼排序的表格中,很容易找到被映射到PUA(0xE000-0xF8FF)的字符。GBK的21886個(gè)字符中有95個(gè)字符屬于PUA。第三張表格列出了這95個(gè)字符(A列)的GBK編碼(B列)、Unicode編碼(C列)以及這些字符在GB18030中對(duì)應(yīng)的Unicode編碼(D列)。其中D列可能不太容易理解,我再解釋?下。GB18030是兼容GBK的,所以這些字符的GBK編碼和GB18030編碼是相同的。例如?的GBK編碼和GB18030編碼都是0xA8BF。但是在GBK和GB18030中,?被映射到不同的Unicode碼位。在GBK中,0xA8BF被映射到Unicode的0xE7C8。在Unicode中,碼位0xE7C8是?個(gè)PUA碼位,保留給?戶使?。在GB18030中,0xA8BF被映射到Unicode的0x01F9。在Unicode中,碼位0x01F9屬于“拉丁字母擴(kuò)充-B”這個(gè)Block,這個(gè)碼位定義的字符是“帶抑?符的拉丁??寫(xiě)字母N”,字形就是?。1.3GBK碼位與Unicode的映射GBK的23940個(gè)碼位定義了21886個(gè)字符,還有23940-21886=2054個(gè)空閑碼位,這2054個(gè)碼位都被映射到Unicode的PUA。在設(shè)計(jì)GBK時(shí),GBK的21886個(gè)字符中有95個(gè)在Unicode中沒(méi)有對(duì)應(yīng)字符,所以這95個(gè)字符也被映射到Unicode的PUA。在GBK的23940個(gè)碼位中,?共有2054+95=2149個(gè)碼位被映射到PUA,對(duì)應(yīng)的PUA編碼是0xE000-0xE864。0xE000-0xE864就是2149個(gè)碼位。這2149個(gè)碼位的分配有以下規(guī)律:碼位所在區(qū)域碼位數(shù)量映射到的PUA范圍?戶區(qū)1:0xAAA1~0xAFFE5640xE000-0xE233?戶區(qū)2:0xF8A1~0xFEFE6580xE234-0xE4C5?戶區(qū)3:0xA140~0xA77E和A180-A7A06720xE4C6-0xE765符號(hào)區(qū)(1區(qū)和5區(qū))的170個(gè)空閑碼位1700xE766-0xE80F2區(qū)的5個(gè)空閑碼位:0xD7FA-0xD7FE50xE810-0xE8144區(qū)的80個(gè)Unicode當(dāng)時(shí)沒(méi)有定義的字符:FE50-FE7E和FE80-FEA0800xE815-0xE864包含兩張表格:1.23940個(gè)GBK碼位與Unicode的映射。兩組數(shù)據(jù)分別按GBK和Unicode排序。2.2149個(gè)映射到PUA的碼位,按Unicode順序排列。2GB18030編碼2.1概述GB18030是多字節(jié)字符集,它的字符可以??個(gè)、兩個(gè)或四個(gè)字節(jié)表?。GB18030的碼位定義如下:字節(jié)數(shù)碼位空間碼位數(shù)字符數(shù)單字節(jié)0x00~0x7F128128雙字節(jié)0x8140~0xFE7E和0x8180~0xFEFE2394021897四字節(jié)0x81308130~0xFE39FE39158760054531GB18030有128+23940+1587600=1611668個(gè)碼位。Unicode的碼位數(shù)?是0x110000(1114112),少于GB18030。所以,GB18030有?夠的空間映射Unicode的所有碼位。GB18030的1611668個(gè)碼位?前定義了128+21897+54531=76556個(gè)字符。Unicode5.0定義了99089個(gè)字符。2.2設(shè)計(jì)思路GB18030編碼可以分為:?jiǎn)巫止?jié)部分、雙字節(jié)部分和四字節(jié)部分。單字節(jié)部分與Unicode的0x00-0x7f完全相同。雙字節(jié)部分與GBK有兩點(diǎn)差異:1.在1區(qū)增加了11個(gè)字符。這樣1區(qū)就有717+11=728個(gè)字符。增加的11個(gè)字符是:?個(gè)歐元符號(hào)(0xA2E3)和10個(gè)豎排標(biāo)點(diǎn)符號(hào)(0xA6D9-0xA6DF、0xA6EC-0xA6ED和0xA6F3)。2.原來(lái)因?yàn)閁nicode沒(méi)有收錄?映射到PUA的字符中的部分字符被新版本的Unicode收錄,所以將這些字符映射到?PUA的碼位。Unicode的BMP?共有65536個(gè)碼位。其中代理區(qū)(0xD800-0xDFFF)有2048個(gè)碼位,這2048個(gè)碼位是不能定義字符的。GB18030的單字節(jié)部分映射了128個(gè)碼位,GB18030的雙字節(jié)部分映射了23940個(gè)碼位。還剩下65536-2048-128-23940=39420個(gè)碼位。GB18030將這39420個(gè)碼位順序映射到從0x81308130開(kāi)始的碼位空間。GB18030將Unicode的16個(gè)輔助平?(0x10000-0x10FFFF,?共1048576個(gè)碼位)順序映射到從0x90308130開(kāi)始的碼位空間。GB18030四字節(jié)部分中只有這兩個(gè)區(qū)域定義了字符,其它空間都是保留區(qū)和?定義區(qū)。本?的第3節(jié)和第4節(jié)還會(huì)詳細(xì)討論GB18030的雙字節(jié)和四字節(jié)部分。GB18030的設(shè)計(jì)思路可以概括到以下?點(diǎn):1.單字節(jié)部分與Unicode?致。2.雙字節(jié)部分與GBK兼容。適當(dāng)調(diào)整?些字符與Unicode的映射。這些字符原來(lái)因?yàn)閁nicode沒(méi)有收錄?被映射到PUA,現(xiàn)在因?yàn)閁nicode已經(jīng)收錄?調(diào)整到?PUA的Unicode碼位。3.將UnicodeBMP部分還沒(méi)有映射的39420個(gè)碼位順序映射到從0x81308130開(kāi)始的四字節(jié)部分。4.將UnicodeBMP以外的16個(gè)輔助平?映射到39420個(gè)碼位順序映射到從0x90308130開(kāi)始的四字節(jié)部分。在GB18030?前定義的76556個(gè)字符中,只有24個(gè)字符被定義到Unicode的PUA區(qū)。這24個(gè)字符包括1區(qū)的10個(gè)豎排標(biāo)點(diǎn)符號(hào)(0xA6D9-0xA6DF、0xA6EC-0xA6ED和0xA6F3)和4區(qū)的14個(gè)漢字(0xFE51、0xFE52、0xFE53、0xFE59、0xFE61、0xFE66、0xFE67、0xFE6C、0xFE6D、0xFE76、0xFE7E、0xFE90、0xFE91、0xFEA0)。4區(qū)的14個(gè)漢字在Unicode5.0中其實(shí)也可以找到?PUA的編碼,詳見(jiàn)。但按照GB18030,它們還是應(yīng)該映射到PUA碼位。2.3GB18030-2000和GB18030-2005的區(qū)別及以后版本GB18030-2005與GB18030-2000的編碼體系結(jié)構(gòu)是完全相同的。GB18030-2005相對(duì)于GB18030-2000主要有以下變化:1.在四字節(jié)字符表中增加CJK統(tǒng)?漢字?jǐn)U充B和已經(jīng)在GB13000中編碼的我國(guó)少數(shù)民族?字字符的字形。其實(shí)GB18030-2000已經(jīng)映射了這些碼位,但GB18030-2000沒(méi)有給出這些字符的字形。2.調(diào)整字符?的編碼。其中?的編碼調(diào)整?較有意思。?的GB18030編碼是0xA8BC,?在Unicode5.0的編碼是0x1E3F。在GB18030-2000中0xA8BC被映射到Unicode的0xE7C7,因?yàn)殡p字節(jié)部分沒(méi)有映射0x1E3F,所以它作為BMP的未映射字符被放到四字節(jié)部分的0x8135F437。GB18030-2005將0xA8BC映射到0x1E3F,那么Unicode碼位0xE7C7怎么辦呢?為了最?化對(duì)原來(lái)編碼的影響,設(shè)計(jì)者將Unicode碼位0xE7C7映射到本來(lái)映射0x1E3F的0x8135F437。GB18030已經(jīng)映射了Unicode的所有碼位,所以不管Unicode怎么變化,GB18030不過(guò)就是在現(xiàn)在的碼位上增加?些字形?已,編碼不會(huì)變化。只有現(xiàn)在還映射到PUA的24個(gè)字符以后可能會(huì)調(diào)整到?PUA碼位。調(diào)整?法應(yīng)該與?的調(diào)整?法相同。2.4GB18030雙字節(jié)部分前?已經(jīng)介紹過(guò)GB18030雙字節(jié)部分與GBK的區(qū)別,本?節(jié)再提?些細(xì)節(jié)。前?也說(shuō)過(guò),GB18030映射了Unicode除代理區(qū)外的所有碼位。所以,UnicodeBMP的6400個(gè)PUA碼位在GB18030中都有對(duì)應(yīng)的碼位。GB18030雙字節(jié)部分映射了2067個(gè)PUA碼位。前?說(shuō)過(guò),GBK映射了2149個(gè)PUA碼位?,F(xiàn)在GB18030雙字節(jié)部分映射了2067個(gè)PUA碼位。所以有2149-2067=82個(gè)字符的映射發(fā)?了變化。GBK原來(lái)有95個(gè)字符映射到PUA,其中81個(gè)字符在GB18030中被映射到?PUA碼位。余下的14個(gè)漢字就是提到的那14個(gè)漢字(0xFE51、0xFE52、0xFE53、0xFE59、0xFE61、0xFE66、0xFE67、0xFE6C、0xFE6D、0xFE76、0xFE7E、0xFE90、0xFE91、0xFEA0)。列出了這些字符的編碼變化。82個(gè)映射變化的碼位,除了這81個(gè)外,還有?個(gè)就是歐元符號(hào):GB18030編碼是0xA2E3,Unicode編碼是0x20AC。碼位0xA2E3在GBK中被映射到0xE76C,GBK的碼位0xA2E3沒(méi)有定義字符。GB18030雙字節(jié)部分與Unicode的映射沒(méi)有規(guī)律,只能通過(guò)查表?法映射。2.5GB18030四字節(jié)部分GB18030四字節(jié)部分的字符可以見(jiàn)GB18030-2005的“表3四字節(jié)部分的碼位安排”,?共54531個(gè)字符。GB18030四字節(jié)部分的碼位可以見(jiàn)GB18030-2005的“7.3四字節(jié)部分字符的排列順序”。其中定義字符的只有兩個(gè)區(qū)域:GB18030?碼位0x81308130~0x8439FE39共50400個(gè)碼位映射該標(biāo)準(zhǔn)單字節(jié)和雙字節(jié)部分沒(méi)有映射過(guò)的39420個(gè)UnicodeBMP碼位。GB18030?碼位0x90308130~0xE339FE39共1058400個(gè)碼位映射Unicode16個(gè)輔助平?(平?1到平?16)的65536*16=1048576個(gè)碼位。為了敘述?便,本?將0x81308130~0x8439FE39稱作“BMP擴(kuò)展部分”,將0x90308130~0xE339FE39稱作“輔助平?部分”。GB18030四字節(jié)部分的碼位空間是0x81308130~0xFE39FE39。第?字節(jié)有(0x39-0x30+1)=10個(gè)可能值。第三字節(jié)有(0xFE-0x81+1)=126個(gè)可能值。第四字節(jié)也是(0x39-0x30+1)=10個(gè)可能值。為了?便下?的演算,本?為這個(gè)碼位空間定義?個(gè)名詞:我們將四字節(jié)碼位空間中第?字節(jié)相同的區(qū)域稱作?級(jí)區(qū)。每個(gè)?級(jí)區(qū)有12600個(gè)碼位,即:10*126*10。我們將四字節(jié)碼位空間中第?字節(jié)和第?字節(jié)相同的區(qū)域稱作?級(jí)區(qū)。每個(gè)?級(jí)區(qū)有1260個(gè)碼位,即:126*10。我們將四字節(jié)碼位空間中前三個(gè)字節(jié)相同的區(qū)域稱作三級(jí)區(qū),每個(gè)三級(jí)區(qū)有10個(gè)碼位。四字節(jié)部分?共有(0xFE-0x81+1)=126個(gè)?級(jí)區(qū)。BMP擴(kuò)展部分有4個(gè)?級(jí)區(qū)。輔助平?部分有84個(gè)?級(jí)區(qū)。還有38個(gè)?級(jí)區(qū)是保留區(qū)或?定義區(qū)。2.5.1BMP擴(kuò)展部分BMP擴(kuò)展部分占據(jù)四字節(jié)部分開(kāi)頭的4個(gè)?級(jí)區(qū),?共有4*12600=50400個(gè)碼位。這段空間的Unicode映射說(shuō)起來(lái)還是很簡(jiǎn)單的,就是順序映射單字節(jié)、雙字節(jié)沒(méi)有映射過(guò)的BMP碼位。這些映射關(guān)系在GB18030-2000中確定下來(lái)。以后的調(diào)整(例如?)只是個(gè)別字符,不會(huì)影響其它字符的位置。但是因?yàn)殡p字節(jié)字符已經(jīng)映射過(guò)的BMP碼位沒(méi)有什么規(guī)律,所以造成BMP擴(kuò)展部分的Unicode映射也不能?公式換算,還是要查表解決。顯然這50400個(gè)碼位中只?到了39420個(gè)碼位,其余碼位都是保留的。出于好玩,我們來(lái)計(jì)算?下最后?個(gè)?保留碼位(0xFFFF)的位置,計(jì)算過(guò)程如下:m1=(39420-1)/12600=3n1=(39420-1)%12600=1619m2=n1/1260=1619/1260=1n2=n1%1260=1619%1260=359m3=n2/10=359/10=35n3=n2%10=359%10=9第?字節(jié)的位置是:0x81+m1=0x81+3=0x84第?字節(jié)的位置是:0x30+m2=0x30+1=0x31第三字節(jié)的位置是:0x81+m3=0x81+35=0xA4第四字節(jié)的位置是:0x30+n3=0x30+9=0x39所以Unicode編碼0xFFFF映射的GB18030碼位是0x8431A439。在BMP擴(kuò)展部分中,0x8431A439以后的碼位都是保留碼位。上述計(jì)算中,/表?整除(例如5/3=1),%表?取余(例如5%3=2)。2.5.2輔助平?部分輔助平?部分?84個(gè)?級(jí)區(qū)(0x90308130~0xE339FE39)直接映射Unicode的16個(gè)輔助平?。這部分映射是可以直接?公式計(jì)算的。讓我們看看怎么計(jì)算。從Unicode編碼到GB18030編碼的映射?法如下:U=Unicode編碼-0x10000m1=U/12600n1=U%12600m2=n1/1260n2=n1%1260m3=n2/10n3=n2%10第?字節(jié)b1=m1+0x90第?字節(jié)b2=m2+0x30第三字節(jié)b3=m3+0x81第四字節(jié)b4=n3+0x30按照上述?法可以計(jì)算出0x10FFFF被映射到0xE3329A35。在輔助平?部分,0xE3329A35以后的碼位都是保留碼位。以上所寫(xiě)的算法可以很容易寫(xiě)成C/C++代碼。對(duì)于不會(huì)編程的讀者,也可以?Excel公式計(jì)算。假設(shè)Unicode編碼放在單元格A12,計(jì)算?法如下:將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,F(xiàn)12=INT(E12/10)將n3放在G12,G12=MOD(E12,10)將第?字節(jié)放在H12,H12=DEC2HEX(B12+144)將第?字節(jié)放在I12,I12=DEC2HEX(D12+48)將第三字節(jié)放在J12,J12=DEC2HEX(F12+129)將第四字節(jié)放在K12,K12=DEC2HEX(G12+48)中有寫(xiě)好上述公式的Excel表格。使?函數(shù)HEX2DEC/DEC2HEX需要通過(guò)“?具->加載宏”鉤上“分析?具庫(kù)”。從GB18030編碼到Unicode編碼的映射?法如下:設(shè)GB18030編碼的四個(gè)字節(jié)依次為:b1、b2、b3、b4,則Unicode編碼=0x10000+(b1-0x90)*12600+(b2-0x30)*1260+(b3-0x81)*10+b4-0x30假設(shè)b1、b2、b3、b4分別放在A4、B4、C4、D4,Unicode編碼放在E4,則Excel計(jì)算公式為:E4==DEC2HEX((HEX2DEC(A4)-144)*12600+(HEX2DEC(B4)-48)*1260+(HEX2DEC(C4)-129)*10+(HEX2DEC(D4)-48)+65536)2.6GB18030和Unicode的映射表給出了GB18030和Unic

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論