字符的編碼(二)

(三)字符編碼的由來(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編碼方案蜕企。


image.png

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)位。


image.png

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)秩彤,如下表所示叔扼。


image.png

不過(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)的別名

image.png

(四)簡(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)系了。具體參見后文值戳。


image.png
三议谷、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)先馆、繁體字融于一體。


image.png

微軟早在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可顯示中文霹琼,但卻不支持中文輸入)务傲。


image.png
六、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è)英文字符占用的空間)惕医。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市噩斟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孤个,老刑警劉巖剃允,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異齐鲤,居然都是意外死亡斥废,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門给郊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牡肉,“玉大人,你說(shuō)我怎么就攤上這事淆九⊥炒福” “怎么了毛俏?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饲窿。 經(jīng)常有香客問(wèn)我煌寇,道長(zhǎng),這世上最難降的妖魔是什么逾雄? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任阀溶,我火速辦了婚禮,結(jié)果婚禮上鸦泳,老公的妹妹穿的比我還像新娘银锻。我一直安慰自己,他們只是感情好做鹰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布击纬。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歼争。 梳的紋絲不亂的頭發(fā)上咽斧,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音殃饿,去河邊找鬼。 笑死芋肠,一個(gè)胖子當(dāng)著我的面吹牛乎芳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帖池,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼奈惑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了睡汹?” 一聲冷哼從身側(cè)響起肴甸,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎囚巴,沒(méi)想到半個(gè)月后原在,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彤叉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年庶柿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽浇。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浮庐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出柬焕,到底是詐尸還是另有隱情审残,我是刑警寧澤梭域,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站维苔,受9級(jí)特大地震影響碰辅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜介时,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一没宾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沸柔,春花似錦循衰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至工三,卻和暖如春迁酸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俭正。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工奸鬓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掸读。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓串远,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親儿惫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子澡罚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 騰訊大講堂——字符編碼的前世今生字符串,那些你不知道的事編碼字符集標(biāo)準(zhǔn)及分類研究通信用語(yǔ)の基礎(chǔ)知識(shí) —— ISO/...
    AItsuki閱讀 1,405評(píng)論 0 4
  • 字符是用戶可以讀寫的最小單位。計(jì)算機(jī)所能支持的字符組成的集合铛铁,就叫做字符集隔显。字符集通常以二維表的形式存在。二維表的...
    劉惜有閱讀 8,087評(píng)論 2 14
  • 編碼問(wèn)題一直困擾著開發(fā)人員避归,尤其在 Java 中更加明顯荣月,因?yàn)?Java 是跨平臺(tái)語(yǔ)言管呵,不同平臺(tái)之間編碼之間的切換...
    x360閱讀 2,470評(píng)論 1 20
  • 這些年梳毙,每到過(guò)年總會(huì)聽到有人說(shuō):“年味淡了,過(guò)年越來(lái)越?jīng)]意思了捐下≌饲拢” 所謂年味萌业,就是年俗,在歷史長(zhǎng)河中奸柬,大家約定俗成...
    藍(lán)色印跡閱讀 252評(píng)論 2 6
  • 作者:魏城 一 歷史的河漲潮了 往事倒灌 淹沒(méi)了記憶的兩岸 二 童心是透明的 當(dāng)你漸漸地長(zhǎng)大 世俗開始給你的心 涂...
    魏城閱讀 229評(píng)論 0 2