ASCII碼
標(biāo)準(zhǔn)字符集
最初的計(jì)算機(jī)只是美國(guó)為首的西方發(fā)達(dá)國(guó)家在用膛虫,在他們的語言中,主要以26個(gè)英文字符為主,加上大小寫氛改、空格和其他一些標(biāo)點(diǎn)符號(hào)等匀借,一共有127個(gè)字符,所以大家約定用一種標(biāo)準(zhǔn)來定義這些編碼平窘,也就是ASCII碼(American Standard Code for Information Interchange吓肋,美國(guó)信息互換標(biāo)準(zhǔn)代碼)。而一個(gè)字節(jié)有八位瑰艘,也就可以表示256個(gè)字符(2^8)是鬼,所以一個(gè)ASCII碼用一個(gè)字節(jié)就可以表示了。
擴(kuò)展字符集
后來紫新,世界上其他國(guó)家也開始使用計(jì)算機(jī)均蜜,然后這些國(guó)家的語言中的很多字符在標(biāo)準(zhǔn)ASCII碼中并沒有,所以芒率,他們就要想辦法增加自己的字符囤耳。又發(fā)現(xiàn)一個(gè)字節(jié)有256個(gè)字符,標(biāo)準(zhǔn)ASCII碼只有127個(gè)字符偶芍,所以充择,他們就用127號(hào)往后的空位來表示他們的新的字符,形成了一個(gè)新的標(biāo)準(zhǔn)匪蟀,叫做ASCII碼的擴(kuò)展字符集椎麦。
GB2312
當(dāng)中國(guó)人開始使用計(jì)算機(jī)后,ASCII碼中已經(jīng)沒有空位來給我們用來表示漢字了材彪,況且观挎,常用的漢字有6000多個(gè),一個(gè)字節(jié)是無論如何不夠我們使用的了段化。于是嘁捷,我們便將127號(hào)以后的字符全部取消掉,并規(guī)定一個(gè)小于127的字符的意義跟以前相同显熏,但是兩個(gè)大于127的字符連在一起時(shí)雄嚣,就表示是一個(gè)漢字,高字節(jié)從0xA1到0xF7佃延,低字節(jié)從0xA1到0xFE现诀,這樣我們就能組合出7000多個(gè)簡(jiǎn)體漢字。并且在這些編碼里履肃,我們還把數(shù)字符號(hào)、羅馬字母等都編寫進(jìn)去了坐桩,還把原來ASCII里本來就有的數(shù)字尺棋、標(biāo)點(diǎn)、字符都統(tǒng)統(tǒng)重新編寫了兩個(gè)字節(jié)的編碼,就是“全角”膘螟,而原本127號(hào)一下的就叫“半角”成福。這種規(guī)范叫做GB2312。
GBK
但是中國(guó)的漢字是在太多了荆残,特別是有些人名(國(guó)家領(lǐng)導(dǎo)人的名字)沒有包含在GB2312中奴艾,就干脆不再要求低字節(jié)也必須是127號(hào)之后了,只要高字節(jié)大于127就固定表示這是一個(gè)漢字的開始内斯,結(jié)果擴(kuò)展后的標(biāo)準(zhǔn)叫做GBK標(biāo)準(zhǔn)蕴潦,GBK包括了GB2312的所有內(nèi)容,同時(shí)又增加了近20000個(gè)漢字(包括繁體字)和符號(hào)俘闯。
GB18030
后來少數(shù)民族也要用計(jì)算機(jī)潭苞,又多了幾千個(gè)少數(shù)民族的字,GBK就擴(kuò)展成了GB18030真朗。中國(guó)的程序員們看到這一系列漢字編碼的標(biāo)準(zhǔn)是好的此疹,于是通稱他們叫做 "DBCS"(Double Byte Charecter Set 雙字節(jié)字符集)。這時(shí)一個(gè)漢字算兩個(gè)英文字符遮婶!
UNICODE
當(dāng)時(shí)各個(gè)國(guó)家都像中國(guó)一樣搞出來這樣一套標(biāo)準(zhǔn)蝗碎,結(jié)果就是誰也不懂誰的編碼,誰也不支持別人的編碼旗扑,就連臺(tái)灣地區(qū)都搞出一套big-5標(biāo)準(zhǔn)衍菱。所以ISO組織便出面解決這個(gè)問題,解決辦法就是廢除所有的地區(qū)性編碼方案肩豁,重新搞了一個(gè)包括地球上所有文化脊串、字母和符號(hào)的編碼,叫做"Universal Multiple-Octet Coded Character Set"清钥,簡(jiǎn)稱 UCS, 俗稱 "UNICODE"琼锋。
ISO規(guī)定,必須用兩個(gè)字節(jié)祟昭,也就是16位統(tǒng)一表示所有字符缕坎,對(duì)于ASCII碼中的“半角”字符,UNICODE保持不變篡悟,只是將原來的長(zhǎng)度從8位擴(kuò)展到了16位谜叹,其他國(guó)家的重新編碼。至此搬葬,所有的字符(不管是漢字還是英文)都是一個(gè)字符荷腊,兩個(gè)字節(jié)。
但是急凰,UNICODE 在制訂時(shí)沒有考慮與任何一種現(xiàn)有的編碼方案保持兼容女仰,這使得 GBK 與UNICODE 在漢字的內(nèi)碼編排上完全是不一樣的,沒有一種簡(jiǎn)單的算術(shù)方法可以把文本內(nèi)容從UNICODE編碼和另一種編碼進(jìn)行轉(zhuǎn)換,這種轉(zhuǎn)換必須通過查表來進(jìn)行疾忍。
UTF-8
UNICODE 來到時(shí)乔外,一起到來的還有計(jì)算機(jī)網(wǎng)絡(luò)的興起,UNICODE 如何在網(wǎng)絡(luò)上傳輸也是一個(gè)必須考慮的問題一罩,于是面向傳輸?shù)谋姸?UTF(UCS Transfer Format)標(biāo)準(zhǔn)出現(xiàn)了杨幼,顧名思義,UTF8就是每次8個(gè)位傳輸數(shù)據(jù)聂渊,而UTF16就是每次16個(gè)位差购,只不過為了傳輸時(shí)的可靠性,從UNICODE到UTF時(shí)并不是直接的對(duì)應(yīng)歧沪,而是要過一些算法和規(guī)則來轉(zhuǎn)換歹撒。中文UTF8大多是三字節(jié)。