(三)字符編碼的由來(lái)
一、為什么需要對(duì)字符進(jìn)行編碼
計(jì)算機(jī)一開始發(fā)明出來(lái)時(shí)是用來(lái)解決數(shù)字計(jì)算問(wèn)題的,后來(lái)人們發(fā)現(xiàn)况鸣,計(jì)算機(jī)還可以做更多的事,例如文本處理议忽。
但計(jì)算機(jī)其實(shí)挺笨的懒闷,它只“認(rèn)識(shí)”010110111000…這樣由0和1兩個(gè)數(shù)字組成的二進(jìn)制數(shù)字,這是因?yàn)橛?jì)算機(jī)的底層硬件實(shí)現(xiàn)就是用電路的開和閉兩種狀態(tài)來(lái)表示0和1兩個(gè)數(shù)字的栈幸。因此愤估,計(jì)算機(jī)只可以直接存儲(chǔ)和處理二進(jìn)制數(shù)字。
為了在計(jì)算機(jī)上也能表示速址、存儲(chǔ)和處理像文字玩焰、符號(hào)等等之類的字符,就必須將這些字符轉(zhuǎn)換成二進(jìn)制數(shù)字芍锚。
當(dāng)然昔园,肯定不是我們想怎么轉(zhuǎn)換就怎么轉(zhuǎn)換,否則就會(huì)造成同一段二進(jìn)制數(shù)字在不同計(jì)算機(jī)上顯示出來(lái)的字符不一樣的情況并炮,因此必須得定一個(gè)統(tǒng)一的默刚、標(biāo)準(zhǔn)的轉(zhuǎn)換規(guī)則。
二逃魄、EBCDIC碼與ASCII碼
于是最開始出現(xiàn)了EBCDIC(Extended Binary Coded Decimal Interchange Code擴(kuò)展二進(jìn)制編碼的十進(jìn)制交換碼)編碼標(biāo)準(zhǔn)荤西。EBCDIC碼是由國(guó)際商用機(jī)器公司(IBM)為大型機(jī)操作系統(tǒng)而開發(fā)設(shè)計(jì)的,于1964年推出伍俘。
在EBCDIC碼中邪锌,英文字母不是連續(xù)排列的,中間出現(xiàn)多次斷續(xù)癌瘾,這帶來(lái)了一些困擾和麻煩觅丰。
因此,在后來(lái)IBM的個(gè)人計(jì)算機(jī)和工作站操作系統(tǒng)中并沒(méi)有采用EBCDIC碼妨退,而是采用了晚于EBCDIC碼推出妇萄、且后來(lái)成為了英文字符編碼工業(yè)標(biāo)準(zhǔn)的ASCII編碼方案蜕企。
ASCII碼(American Standard Code for Information Interchange美國(guó)信息交換標(biāo)準(zhǔn)碼),由美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)ANSI(American National Standard Institute)于1968年正式制定嚣伐。
之后糖赔,又于1972年被ISO/IEC采用,制定為ISO/IEC 646標(biāo)準(zhǔn)(ISO轩端,即國(guó)際標(biāo)準(zhǔn)化組織International Standardization Organization放典,成立于1946年;IEC基茵,即國(guó)際電工技術(shù)委員會(huì)International Electrotechnical Commission奋构,成立于1906年;ISO/IEC往往用來(lái)表示由這兩大國(guó)際組織聯(lián)合制定的標(biāo)準(zhǔn))拱层。
由于ASCII碼要晚于EBCDIC碼出現(xiàn)(網(wǎng)上也有文章說(shuō)是ASCII碼要早于EBCDIC碼開始設(shè)計(jì)弥臼,但1968年ASCII碼才正式確定為標(biāo)準(zhǔn)),ASCII碼的編碼方式參照了EBCDIC碼根灯,并吸取了其經(jīng)驗(yàn)教訓(xùn)径缅,將英文字母進(jìn)行了連續(xù)排列,這方便了程序處理烙肺。
ASCII編碼方案雖然不是最早出現(xiàn)的字符編碼方案纳猪,但卻是最基礎(chǔ)、最重要桃笙、應(yīng)用最廣泛的字符編碼方案氏堤。
目前所通行的其他字符編碼方案,比如ISO-8859搏明、GB系列(GB2312鼠锈、GBK、GB18030星著、GB13000)购笆、Big5、Unicode等等虚循,均直接或間接兼容ASCII碼由桌。
而像EBCDIC這樣與ASCII完全不兼容的編碼方案,基本上處于已淘汰或?qū)⒁蕴木车亍?/p>
三邮丰、ASCII字符編碼方案介紹
ASCII碼使用七個(gè)二進(jìn)制數(shù)字(bit比特、位)來(lái)表示一個(gè)字符铭乾,總共表示128個(gè)字符(2^7 = 128剪廉,二進(jìn)制編碼為0000 0000 ~ 0111 1111,對(duì)應(yīng)的十進(jìn)制就是0~127)炕檩。
由于個(gè)人計(jì)算機(jī)普遍采用8位一個(gè)字節(jié)來(lái)進(jìn)行存取與處理斗蒋,因此剩下最高位的那1比特一般為0捌斧,但有時(shí)也被用作一些通訊系統(tǒng)的奇偶校驗(yàn)位。
ASCII字符集共計(jì)有128個(gè)字符(見上表)泉沾,碼點(diǎn)編號(hào)(即字符編號(hào))從0到127(二進(jìn)制為從0000 0000到0111 1111捞蚂,十六進(jìn)制為從0x00到0x7F),二進(jìn)制最高位都是0跷究。其中:
1)0~31:控制字符或通訊專用字符(不可顯示不可打印字符)姓迅,如0x07(BEL響鈴)會(huì)讓計(jì)算機(jī)發(fā)出嗶的一聲、0x00(NUL空俊马,注意不是空格)通常用于指示字符串的結(jié)束丁存、0x0D(CR回車)和0x0A(LF換行)用于指示打印機(jī)的打印針頭退到行首(即回車)并移到下一行(即換行)等。
2)32~126:可顯示可打印字符(其中32為可顯示但不可打印的空格字符)柴我,48~57為0-9的阿拉伯?dāng)?shù)字解寝,65~90為26個(gè)大寫英文字母,97~122為26個(gè)小寫英文字母艘儒,其余的是一些標(biāo)點(diǎn)符號(hào)聋伦、運(yùn)算符號(hào)等。
3)127:控制字符DEL界睁。
這時(shí)候的字符編解碼非常簡(jiǎn)單觉增,比如若要將字符序列編碼為二進(jìn)制流寫入存儲(chǔ)設(shè)備,只需要將該字符序列里的各個(gè)字符在ASCII字符集中的字符編號(hào)(即碼點(diǎn)編號(hào))晕窑,直接以一個(gè)二進(jìn)制字節(jié)寫入存儲(chǔ)設(shè)備即可抑片,字符編號(hào)就是字符編碼,中間不需要經(jīng)過(guò)特別的編碼算法進(jìn)行字符編號(hào)到字符編碼的轉(zhuǎn)換計(jì)算杨赤,更不存在所謂碼元序列到字節(jié)序列的轉(zhuǎn)換敞斋。
四、EASCII及ISO 8859字符編碼方案
計(jì)算機(jī)出現(xiàn)之后疾牲,首先逐漸從美國(guó)發(fā)展到了歐洲植捎。由于歐洲很多國(guó)家所用到的字符中,除了基本的阳柔、美國(guó)也用的那128個(gè)ASCII字符之外焰枢,還有很多衍生的拉丁字母等字符。比如舌剂,在法語(yǔ)中济锄,字母上方有注音符號(hào);而歐洲其他國(guó)家也有各自特有的字符霍转。
考慮到一個(gè)字節(jié)能夠表示的編碼實(shí)際上有256個(gè)(2^8 = 256)荐绝,而ASCII字符卻只用到了一個(gè)字節(jié)中的低7位(因此在ASCII碼中最高位總是為0),編號(hào)為0x000x7F(十進(jìn)制為0127)避消。也就是說(shuō)低滩,ASCII只使用了一個(gè)字節(jié)所能表示的256個(gè)編碼中的前128個(gè)(2^7 = 128)編碼召夹,而后128個(gè)編碼相當(dāng)于被閑置了。因此恕沫,歐洲各國(guó)紛紛打起了后面這128個(gè)編碼的主意监憎。
可問(wèn)題在于,歐洲各國(guó)同時(shí)都有這樣的想法婶溯。于是各國(guó)針對(duì)后面的0x800xFF(十進(jìn)制為128255)這128個(gè)編碼分別對(duì)應(yīng)什么樣的字符鲸阔,就有了各自不同的設(shè)計(jì)。
為了結(jié)束歐洲各國(guó)這種各自為政的混亂局面爬虱,于是又先后設(shè)計(jì)了兩套統(tǒng)一的隶债,既兼容ASCII碼,又支持歐洲各國(guó)所使用的那些衍生字符的單字節(jié)編碼方案:一個(gè)是EASCII(Extended ASCII)字符編碼方案跑筝,另一個(gè)是ISO/IEC 8859字符編碼方案死讹。
先來(lái)說(shuō)EASCII碼。EASCII碼同樣也是將ASCII中閑置的最高位(即首位)用來(lái)編碼新的字符(這些ASCII字符之外的新字符曲梗,其最高位總是為1)赞警。換言之,也就是將一個(gè)字節(jié)中的全部8個(gè)比特位用來(lái)表示一個(gè)字符虏两。比如愧旦,法語(yǔ)中的é的編碼為130(二進(jìn)制1000 0010)。
顯然定罢,EASCII碼雖與ASCII碼一樣使用單字節(jié)編碼笤虫,但卻可以表示最多256個(gè)字符(2^8 = 256),比ASCII的128個(gè)字符(2^7=128)多了一倍祖凫。
因此琼蚯,在EASCII碼中,當(dāng)?shù)谝粋€(gè)比特位(即字節(jié)的最高位)為0時(shí)惠况,仍表示之前那些常用的ASCII字符(實(shí)際的二進(jìn)制編碼為0000 0000 ~ 0111 1111遭庶,對(duì)應(yīng)的十進(jìn)制就是0~127),而為1時(shí)就表示補(bǔ)充擴(kuò)展的其他衍生字符(實(shí)際的二進(jìn)制編碼為1000 0000 ~ 1111 1111稠屠,對(duì)應(yīng)的十進(jìn)制就是128~255)峦睡。
這樣就在ASCII碼的基礎(chǔ)上,既保證了對(duì)ASCII碼的兼容性权埠,又補(bǔ)充擴(kuò)展了新的字符榨了,于是就稱之為Extended ASCII(擴(kuò)展ASCII)碼,簡(jiǎn)稱EASCII碼攘蔽。
EASCII碼比ASCII碼擴(kuò)充出來(lái)的符號(hào)包括表格符號(hào)阻逮、計(jì)算符號(hào)、希臘字母和特殊的拉丁符號(hào)秩彤,如下表所示叔扼。
不過(guò),EASCII碼目前已經(jīng)很少使用漫雷,常用的是ISO/IEC 8859字符編碼方案瓜富。該方案與EASCII碼類似,也同樣是在ASCII碼的基礎(chǔ)上降盹,利用了ASCII的7位編碼所沒(méi)有用到的最高位(首位)与柑,將編碼范圍從原先ASCII碼的0x000x7F(十進(jìn)制為0127),擴(kuò)展到了0x800xFF(十進(jìn)制為128255)蓄坏。
ISO/IEC 8859字符編碼方案所擴(kuò)展的這128個(gè)編碼中价捧,實(shí)際上只有0xA00xFF(十進(jìn)制為160255)被實(shí)際使用。也就是說(shuō)涡戳,只有0xA00xFF(十進(jìn)制為160255)這96個(gè)編碼定義了字符结蟋,而0x80~0x9F
(十進(jìn)制為128~159)這32個(gè)編碼并未定義字符。
顯然渔彰,ISO/IEC 8859字符編碼方案同樣是單字節(jié)編碼方案嵌屎,也同樣完全兼容ASCII。
注意恍涂,與ASCII宝惰、EASCII屬于單個(gè)獨(dú)立的字符集不同,ISO/IEC 8859是一組字符集的總稱再沧,其下共包含了15個(gè)字符集尼夺,即ISO/IEC 8859-n,其中n=1,2,3,...,15,16(其中12未定義炒瘸,所以共15個(gè))淤堵。
這15個(gè)字符集大致上包括了歐洲各國(guó)所使用到的字符(甚至還包括一些外來(lái)語(yǔ)字符),而且每一個(gè)字符集的補(bǔ)充擴(kuò)展部分(即除了兼容ASCII字符之外的部分)都只實(shí)際使用了0xA00xFF(十進(jìn)制為160255)這96個(gè)編碼什燕。
其中粘勒,ISO/IEC 8859-1收錄了西歐常用字符(包括德法兩國(guó)的字母),目前使用得最為普遍屎即。ISO/IEC 8859-1往往簡(jiǎn)稱為ISO 8859-1庙睡,而且還有一個(gè)稱之為L(zhǎng)atin-1(也寫作Latin1)的別名
(四)簡(jiǎn)體漢字編碼方案(GB2312、GBK等)以及全角技俐、半角乘陪、CJK
一、概述
英文字母再加一些其他標(biāo)點(diǎn)字符之類的也不會(huì)超過(guò)256個(gè)雕擂,用一個(gè)字節(jié)來(lái)表示一個(gè)字符就足夠了(2^8 = 256)啡邑。但其他一些文字不止這么多字符,比如中文中的漢字就多達(dá)10多萬(wàn)個(gè)井赌,一個(gè)字節(jié)只能表示256個(gè)字符谤逼,肯定是不夠的贵扰,因此只能使用多個(gè)字節(jié)來(lái)表示一個(gè)字符。
于是當(dāng)計(jì)算機(jī)被引入到中國(guó)后流部,相關(guān)部門設(shè)計(jì)了GB系列編碼(“GB”為“國(guó)標(biāo)”的漢語(yǔ)拼音首字母縮寫戚绕,即“國(guó)家標(biāo)準(zhǔn)”之意)。
按照GB系列編碼枝冀,在一段文本中舞丛,如果一個(gè)字節(jié)是0~127,那么這個(gè)字節(jié)的含義同ASCII編碼果漾,否則球切,這個(gè)字節(jié)和下一個(gè)字節(jié)共同組成漢字(或是GB編碼定義的其他字符)。
因此绒障,GB系列編碼向下兼容ASCII吨凑,也就是說(shuō),如果一段用GB編碼文本里的所有字符都在ASCII中有定義(即該文本全部由ASCII字符組成)端盆,那么這段編碼和ASCII編碼完全一樣怀骤。
GB編碼早期收錄的漢字不足一萬(wàn)個(gè),基本能滿足日常使用需求焕妙,但不包含一些生僻字蒋伦,因此后來(lái)又進(jìn)行了擴(kuò)展。
最早的GB編碼是GB2312焚鹊,后來(lái)有了在GB2312基礎(chǔ)上擴(kuò)展的GBK痕届,最新的是GB18030,加入了一些國(guó)內(nèi)少數(shù)民族的文字末患,一些生僻字被編到了4個(gè)字節(jié)研叫,每擴(kuò)展一次都完全保留之前版本的編碼,所以每個(gè)新版本都向下兼容璧针。
這里要指出的是嚷炉,雖然都用多個(gè)字節(jié)表示一個(gè)字符,但是GB類的漢字編碼與后文的Unicode編碼方案UTF-8探橱、UTF-16申屹、UTF-32是毫無(wú)關(guān)系的(其中UTF-8對(duì)于ASCII字符仍用一個(gè)字節(jié)編碼,而非ASCII字符則為多字節(jié)編碼)隧膏。
不過(guò)哗讥,也正因?yàn)椴坏貌皇褂枚鄠€(gè)字節(jié)來(lái)表示一個(gè)字符,相較于只使用單個(gè)字節(jié)的ASCII編碼方案胞枕,GB類編碼方案與后面要介紹的Unicode編碼方案一樣杆煞,無(wú)疑導(dǎo)致了更高的復(fù)雜度。
比如,當(dāng)多字節(jié)字符與原先的ASCII字符混用時(shí):
1)要么將原先的ASCII字符重新編碼為多個(gè)字節(jié)表示决乎,以便與其他多字節(jié)字符統(tǒng)一起來(lái)(UTF-16队询、UTF-32等采用的是這種方法);
2)要么保持ASCII字符為單個(gè)字節(jié)編碼不變构诚,但將其他多字節(jié)字符編碼中的各個(gè)字節(jié)的最高位(首位)設(shè)為1娘摔,以避免與字節(jié)最高位為0的ASCII編碼相沖突(GB、UTF-8等采用的是這種方法)唤反。
前者具有更高的空間復(fù)雜度,因?yàn)樵戎恍枰獑蝹€(gè)字節(jié)表示的ASCII字符鸭津,現(xiàn)在也必須用多個(gè)字節(jié)來(lái)表示彤侍,顯然更為耗費(fèi)存儲(chǔ)空間;后者則具有更高的時(shí)間復(fù)雜度逆趋,因?yàn)闉榱吮苊鉀_突以及其他種種考慮(比如擴(kuò)展性盏阶、容錯(cuò)性等),使用了更為復(fù)雜的編碼算法(encoding algorithm)闻书,無(wú)疑更為耗費(fèi)計(jì)算時(shí)間名斟。
而且,無(wú)論是前者還是后者魄眉,若多字節(jié)編碼中采用的又是多字節(jié)碼元(Code Unit)的話(如UTF-16砰盐、UTF-32編碼采用的就是多字節(jié)碼元,而UTF-8中的非ASCII字符雖然也是多字節(jié)編碼坑律,但采用的卻是單字節(jié)碼元)岩梳,由于歷史的原因,又進(jìn)一步引發(fā)了更為麻煩的字節(jié)序(Byte-Order)問(wèn)題晃择。(編碼算法、碼元宫屠、字節(jié)序的相關(guān)介紹列疗,詳見后文解釋)
二、GB2312
GB2312編碼方案浪蹂,即《信息交換用漢字編碼字符集——基本集》抵栈,是由中國(guó)國(guó)家標(biāo)準(zhǔn)總局于1980年發(fā)布、1981年5月1日開始實(shí)施的一套國(guó)家標(biāo)準(zhǔn)乌逐,標(biāo)準(zhǔn)號(hào)為GB2312-1980竭讳。
GB2312編碼適用于漢字處理、漢字通信等系統(tǒng)之間的信息交換浙踢,通行于中國(guó)大陸绢慢;新加坡等地也采用此編碼。中國(guó)大陸幾乎所有的中文系統(tǒng)和國(guó)際化的軟件都支持GB2312。
GB2312編碼為了避免與ASCII字符編碼(0~127)相沖突胰舆,規(guī)定表示一個(gè)漢字的編碼(即漢字內(nèi)碼)的字節(jié)其值必須大于127(即字節(jié)的最高位為1)骚露,并且必須是兩個(gè)大于127的字節(jié)連在一起來(lái)共同表示一個(gè)漢字(GB2312為雙字節(jié)編碼),前一字節(jié)稱為高字節(jié)缚窿,后一字節(jié)稱為低字節(jié)棘幸;而一個(gè)字節(jié)的值若小于等于127(即字節(jié)的最高位為0),自然是仍表示一個(gè)原來(lái)的ASCII字符(ASCII為單字節(jié)編碼)倦零。
因此误续,可以認(rèn)為GB2312是對(duì)ASCII的中文擴(kuò)展(即GB2312與ASCII相兼容),正如EASCII是對(duì)ASCII的歐洲文字?jǐn)U展一樣扫茅。
不過(guò)蹋嵌,很顯然的是,GB2312與EASCII碼的128~255這段擴(kuò)展部分所表示的字符是不同的葫隙。也就是說(shuō)栽烂,GB2312與EASCII雖然都兼容ASCII,但GB2312并不兼容EASCII的擴(kuò)展部分恋脚。
事實(shí)上腺办,目前世界上除ASCII之外的其它通行的字符編碼方案,基本上都兼容ASCII糟描,但相互之間卻并不兼容怀喉。
GB 2312標(biāo)準(zhǔn)共收錄6763個(gè)漢字,其中一級(jí)漢字3755個(gè)蚓挤,二級(jí)漢字3008個(gè)磺送;同時(shí),除了漢字灿意,GB2312還收錄了包括拉丁字母估灿、希臘字母、日文平假名及片假名字母缤剧、俄語(yǔ)西里爾字母在內(nèi)的682個(gè)字符馅袁。
可能是出于顯示上視覺(jué)美觀的考慮,除漢字之外的682個(gè)字符中荒辕,甚至包括了ASCII里本來(lái)就有的數(shù)字汗销、標(biāo)點(diǎn)、字母等字符抵窒。也就是說(shuō)弛针,這些ASCII里原來(lái)就有的單字節(jié)編碼的字符,又再編了兩個(gè)字節(jié)長(zhǎng)的GB2312編碼版本李皇。這682個(gè)字符就是常說(shuō)的“全角”字符削茁,而這682個(gè)字符中所對(duì)應(yīng)的ASCII字符就被稱之為“半角”字符。
附:全角、半角
全角字符是中文顯示及雙字節(jié)中文編碼的歷史遺留問(wèn)題茧跋。
早期的點(diǎn)陣顯示器上由于像素有限慰丛,原先ASCII西文字符的顯示寬度(比如8像素的寬度)用來(lái)顯示漢字有些捉襟見肘(實(shí)際上早期的針式打印機(jī)在打印輸出時(shí)也存在這個(gè)問(wèn)題),因此就采用了兩倍于ASCII字符的顯示寬度(比如16像素的寬度)來(lái)顯示漢字瘾杭。
這樣一來(lái)诅病,ASCII西文字符在顯示時(shí)其寬度為漢字的一半≈嗨福或許是為了在西文字符與漢字混合排版時(shí)贤笆,讓西文字符能與漢字對(duì)齊等視覺(jué)美觀上的考慮,于是就設(shè)計(jì)了讓西文字母讨阻、數(shù)字和標(biāo)點(diǎn)等特殊字符在外觀視覺(jué)上也占用一個(gè)漢字的視覺(jué)空間(主要是寬度)苏潜,并且在內(nèi)部存儲(chǔ)上也同漢字一樣使用2個(gè)字節(jié)進(jìn)行存儲(chǔ)的方案。這些與漢字在顯示寬度上一樣的字符就被稱之為全角字符变勇。
而原來(lái)ASCII中的西文字符由于在外觀視覺(jué)上僅占用半個(gè)漢字的視覺(jué)空間(主要是寬度),并且在內(nèi)部存儲(chǔ)上使用1個(gè)字節(jié)進(jìn)行存儲(chǔ)贴唇,相對(duì)于全角字符搀绣,因而被稱之為半角字符。
后來(lái)戳气,其中的一些全角字符因?yàn)楸容^有用链患,就得到了廣泛應(yīng)用(比如全角的逗號(hào)“,”瓶您、問(wèn)號(hào)“麻捻?”、感嘆號(hào)“呀袱!”贸毕、空格“ ”等,這些字符在輸入法中文輸入狀態(tài)下的半角與全角是一樣的夜赵,英文輸入狀態(tài)下全角跟中文輸入狀態(tài)一樣明棍,但半角大約為全角的二分之一寬),專用于中日韓文本寇僧,成為了標(biāo)準(zhǔn)的中日韓標(biāo)點(diǎn)字符摊腋。而其它的許多全角字符則逐漸失去了價(jià)值(現(xiàn)在很少需要讓純文本的中文和西文字字對(duì)齊了),就很少再用了嘁傀。
現(xiàn)在全球字符編碼的事實(shí)標(biāo)準(zhǔn)是Unicode字符集及基于此的UTF-8兴蒸、UTF-16等編碼實(shí)現(xiàn)方式。Unicode吸納了許多遺留(legacy)編碼细办,并且為了兼容性而保留了所有字符橙凳。因此中文編碼方案中的這些全角字符也保留下來(lái)了,而國(guó)家標(biāo)準(zhǔn)也仍要求字體和軟件都支持這些全角字符。
不過(guò)痕惋,半角和全角字符的關(guān)系在UTF-8区宇、UTF-16等中不再是簡(jiǎn)單的1字節(jié)和2字節(jié)的關(guān)系了。具體參見后文值戳。
三议谷、GB13000
為了便于多個(gè)文種的同時(shí)處理,國(guó)際標(biāo)準(zhǔn)化組織下屬編碼字符集工作組制定了新的編碼字符集標(biāo)準(zhǔn)——ISO/IEC 10646(與統(tǒng)一聯(lián)盟制定的Unicode標(biāo)準(zhǔn)兼容堕虹,兩者的關(guān)系詳見后文)卧晓。
該標(biāo)準(zhǔn)第一次頒布是在1993年,當(dāng)時(shí)只頒布了其第一部分赴捞,即ISO/IEC 10646.1:1993逼裆,收錄中國(guó)大陸、臺(tái)灣赦政、日本及韓國(guó)通用字符集的漢字胜宇,總共20,902個(gè)。制定這個(gè)標(biāo)準(zhǔn)的目的是對(duì)世界上的所有字符統(tǒng)一編碼恢着,以實(shí)現(xiàn)世界上所有字符在計(jì)算機(jī)上的統(tǒng)一處理桐愉。
中國(guó)相應(yīng)的國(guó)家標(biāo)準(zhǔn)是GB13000.1-1993《信息技術(shù)通用多八位編碼字符集(UCS)第一部分:體系結(jié)構(gòu)與基本多文種平面》。
2010年又發(fā)布了替代標(biāo)準(zhǔn)——GB13000-2010《信息技術(shù)通用多八位編碼字符集(UCS)》掰派,此標(biāo)準(zhǔn)等同于國(guó)際標(biāo)準(zhǔn)ISO/IEC 10646:2003《信息技術(shù)通用多八位編碼字符集(UCS)》从诲。
GB13000與國(guó)際標(biāo)準(zhǔn)ISO/IEC10646及Unicode標(biāo)準(zhǔn)目前在基本平面(即BMP,詳見后文)上保持一致靡羡。
四系洛、GBK
GB2312-1980共收錄6763個(gè)漢字,覆蓋了中國(guó)大陸99.75%的使用頻率略步,基本滿足了漢字的計(jì)算機(jī)處理需要描扯。但對(duì)于人名、古漢語(yǔ)等方面出現(xiàn)的罕用字趟薄、生僻字荆烈,GB2312不能處理,如部分在GB2312-1980推出以后才簡(jiǎn)化的漢字(如“啰”)竟趾、部分人名用字(如前總理朱镕基的“镕”字)憔购、臺(tái)灣及香港使用的繁體字、日語(yǔ)及朝鮮語(yǔ)漢字等岔帽,并未收錄在內(nèi)玫鸟。
于是利用GB2312-1980未使用的碼點(diǎn)空間,收錄GB13000.1-1993的全部字符犀勒,于1995年又發(fā)布了《漢字內(nèi)碼擴(kuò)展規(guī)范(GBK)》(Guo-Biao Kuozhan國(guó)家標(biāo)準(zhǔn)擴(kuò)展碼屎飘,是根據(jù)GB13000.1-1993妥曲,對(duì)GB2312-1980的擴(kuò)展;英文全稱Chinese Internal Code Specification)钦购。
不過(guò)檐盟,雖然GBK收錄了GB13000.1-1993的全部字符,但編碼方式并不相同押桃。
GBK跟GB2312一樣是雙字節(jié)編碼葵萎,然而,GBK只要求第一個(gè)字節(jié)即高字節(jié)是大于127就固定表示這是一個(gè)漢字的開始(0~127當(dāng)然表示的還是ASCII字符)唱凯,不再要求第二個(gè)字節(jié)即低字節(jié)也必須是127號(hào)之后的編碼羡忘。這樣,作為同樣是雙字節(jié)編碼的GBK才可以收錄比GB2312更多字符磕昼。
GBK字符集向后完全兼容GB2312卷雕,同時(shí)還支持GB2312-1980不支持的部分中文簡(jiǎn)體、中文繁體票从、日文假名(不過(guò)這個(gè)編碼不支持韓國(guó)文字漫雕,也是其在實(shí)際使用中與Unicode編碼相比欠缺的部分),共收錄漢字21003個(gè)峰鄙、符號(hào)883個(gè)蝎亚,并提供1894個(gè)造字碼位,簡(jiǎn)先馆、繁體字融于一體。
微軟早在Windows 95簡(jiǎn)體中文版中就采用了GBK編碼躺彬,也就是對(duì)微軟內(nèi)部之前的CP936字碼表(Code Page 936)進(jìn)行了擴(kuò)展(之前CP936和GB2312-1980一模一樣)煤墙。
微軟的CP936通常被視為等同于GBK,連IANA(Internet Assigned Numbers Authority互聯(lián)網(wǎng)號(hào)碼分配局)也以“CP936”為“GBK”之別名宪拥。
但事實(shí)上比較起來(lái)仿野,GBK定義之字符較CP936多出95個(gè)(15個(gè)非漢字及80個(gè)漢字),皆為當(dāng)時(shí)未收入ISO 10646 / Unicode的符號(hào)她君。
【注:有說(shuō)是微軟在GB2312的基礎(chǔ)上擴(kuò)展制訂了GBK脚作,然后GBK才成為“國(guó)家標(biāo)準(zhǔn)”(也有說(shuō)GBK不是國(guó)家標(biāo)準(zhǔn),只是“技術(shù)規(guī)范指導(dǎo)性文件”)缔刹;但網(wǎng)上也有資料說(shuō)是先有GBK(由全國(guó)信息技術(shù)標(biāo)準(zhǔn)化技術(shù)委員會(huì)于1995年12月1日制定)球涛,然后微軟才在其內(nèi)部所用的CP936代碼頁(yè)中以GBK為參考進(jìn)行了擴(kuò)展⌒8洌】
五亿扁、GB18030
中國(guó)國(guó)家質(zhì)量技術(shù)監(jiān)督局于2000年3月17日推出了GB18030-2000標(biāo)準(zhǔn),以取代GBK鸟廓。GB18030-2000除保留全部GBK編碼漢字之外从祝,在第二字節(jié)再度進(jìn)行擴(kuò)展襟己,增加了大約一百個(gè)漢字及四位元組編碼空間。
GB18030《信息交換用漢字編碼字符集基本集的補(bǔ)充》是我國(guó)繼GB2312-1980和GB13000-1993之后最重要的漢字編碼標(biāo)準(zhǔn)牍陌,是我國(guó)計(jì)算機(jī)系統(tǒng)必須遵循的基礎(chǔ)性標(biāo)準(zhǔn)之一擎浴。
2005年,GB18030編碼方案又進(jìn)行了擴(kuò)充毒涧,于是又有了GB18030-2005《信息技術(shù)中文編碼字符集》贮预。如前所述,GB18030-2000是GBK的取代版本链嘀,它的主要特點(diǎn)是在GBK基礎(chǔ)上增加了CJK中日韓統(tǒng)一表意文字?jǐn)U充A的漢字萌狂;而GB18030-2005的主要特點(diǎn)是在GB18030-2000基礎(chǔ)上又增加了CJK中日韓統(tǒng)一表意文字?jǐn)U充B的漢字。
微軟也為GB18030定義了代碼頁(yè)(Codepage):CP54936怀泊,但是這個(gè)代碼頁(yè)實(shí)際上并沒(méi)有真正使用(在Windows 7的“控制面板”-“區(qū)域和語(yǔ)言”-“管理”-“非Unicode程序的語(yǔ)言”中沒(méi)有提供選項(xiàng)茫藏;在Windows cmd命令行中可通過(guò)命令chcp 54936更改,之后在cmd可顯示中文霹琼,但卻不支持中文輸入)务傲。
六、CJK中日韓統(tǒng)一表意文字
CJK指的是中日韓統(tǒng)一表意文字(CJK Unified Ideographs)枣申,也稱統(tǒng)一漢字(Unihan)售葡,目的是要把分別來(lái)自中文(包含壯文)、日文忠藤、韓文挟伙、越文中,起源相同模孩、本義相同尖阔、形狀一樣或稍異的表意文字在Unicode標(biāo)準(zhǔn)及ISO/IEC 10646標(biāo)準(zhǔn)內(nèi)賦予相同的碼點(diǎn)值。(Unicode標(biāo)準(zhǔn)及ISO/IEC 10646標(biāo)準(zhǔn)后文有詳細(xì)解釋)
CJK是中文(Chinese)榨咐、日文(Japanese)介却、韓文(Korean)三國(guó)文字英文首字母的縮寫。顧名思義块茁,它能夠支持這三種文字齿坷,但實(shí)際上,CJK能夠支持包括中文(包含壯文)数焊、日文永淌、韓文、越文在內(nèi)的多種亞洲雙字節(jié)文字佩耳。
所謂“起源相同仰禀、本義相同、形狀一樣或稍異的表意文字”蚕愤,主要為漢字答恶,包括繁體字饺蚊、簡(jiǎn)體字;但也有仿漢字悬嗓,包括方塊壯字污呼、日本漢字(漢字/かんじ)、韓國(guó)漢字(漢字/??)包竹、越南的喃字(?喃/Ch? N?m)與儒字(?儒/Ch? Nho)等燕酷。
此計(jì)劃原本只包含中文、日文及韓文中所使用的漢字和仿漢字周瞎,統(tǒng)稱中日韓(CJK)統(tǒng)一表意文字(Unified Ideographs)苗缩。后來(lái),此計(jì)劃才加入了越南文的喃字声诸,所以又合稱為中日韓越(CJKV)統(tǒng)一表意文字酱讶。
七、小結(jié)
GB類的字符集均屬于雙字節(jié)字符集DBCS(Double Byte Character Set)彼乌。
在DBCS系列編碼方案里泻肯,最大的特點(diǎn)是兩字節(jié)長(zhǎng)的中文字符和一字節(jié)長(zhǎng)的英文字符(ASCII字符)相兼容,可以并存于同一個(gè)文件內(nèi)慰照。
因此灶挟,寫程序時(shí)為了支持中文處理,必須要注意字符串里的每一個(gè)字節(jié)的值毒租,如果這個(gè)值是大于127的稚铣,那么就認(rèn)為一個(gè)雙字節(jié)字符集里的字符出現(xiàn)了。
使用GB類編碼方案時(shí)一般都要時(shí)刻記资濉:一個(gè)漢字由兩個(gè)字節(jié)組成(即一個(gè)漢字占用的空間相當(dāng)于兩個(gè)英文字符占用的空間)惕医。