Unicode編碼介紹
先從ASCII說(shuō)起。ASCII是用來(lái)表示英文字符的一種編碼規(guī)范,每個(gè)ASCII字符占用1個(gè)字節(jié)(8bits)
因此,ASCII編碼可以表示的最大字符數(shù)是256,其實(shí)英文字符并沒(méi)有那么多,一般只用前128個(gè)(最高位為0),其中包括了控制字符、數(shù)字、大小寫字母和其他一些符號(hào)。
而最高位為1的另128個(gè)字符被成為“擴(kuò)展ASCII”,一般用來(lái)存放英文的制表符、部分音標(biāo)字符等等的一些其他符號(hào)
這種字符編碼規(guī)范顯然用來(lái)處理英文沒(méi)有什么問(wèn)題。(實(shí)際上也可以用來(lái)處理法文、德文等一些其他的西歐字符,但是不能和英文通用),但是面對(duì)中文、阿拉伯文之類復(fù)雜的文字,255個(gè)字符顯然不夠用
于是,各個(gè)國(guó)家紛紛制定了自己的文字編碼規(guī)范,其中中文的文字編碼規(guī)范叫做“GB2312-80”,它是和ASCII兼容的一種編碼規(guī)范,其實(shí)就是利用擴(kuò)展ASCII沒(méi)有真正標(biāo)準(zhǔn)化這一點(diǎn),把一個(gè)中文字符用兩個(gè)擴(kuò)展ASCII字符來(lái)表示。
但是這個(gè)方法有問(wèn)題,最大的問(wèn)題就是,中文文字沒(méi)有真正屬于自己的編碼,因?yàn)閿U(kuò)展ASCII碼雖然沒(méi)有真正的標(biāo)準(zhǔn)化,但是PC里的ASCII碼還是有一個(gè)事實(shí)標(biāo)準(zhǔn)的(存放著英文制表符),所以很多軟件利用這些符號(hào)來(lái)畫表格。這樣的軟件用到中文系統(tǒng)中,這些表格符就會(huì)被誤認(rèn)作中文字,破壞版面。而且,統(tǒng)計(jì)中英文混合字符串中的字?jǐn)?shù),也是比較復(fù)雜的,我們必須判斷一個(gè)ASCII碼是否擴(kuò)展,以及它的下一個(gè)ASCII是否擴(kuò)展,然后才“猜”那可能是一個(gè)中文字。
總之當(dāng)時(shí)處理中文是很痛苦的。而更痛苦的是GB2312是國(guó)家標(biāo)準(zhǔn),臺(tái)灣當(dāng)時(shí)有一個(gè)Big5編碼標(biāo)準(zhǔn),很多編碼和GB是相同的,所以……,嘿嘿。
這時(shí)候,我們就知道,要真正解決中文問(wèn)題,不能從擴(kuò)展ASCII的角度入手,也不能僅靠中國(guó)一家來(lái)解決。而必須有一個(gè)全新的編碼系統(tǒng),這個(gè)系統(tǒng)要可以將中文、英文、法文、德文……等等所有的文字統(tǒng)一起來(lái)考慮,為每個(gè)文字都分配一個(gè)單獨(dú)的編碼,這樣才不會(huì)有上面那種現(xiàn)象出現(xiàn)。
于是,Unicode誕生了。
Unicode有兩套標(biāo)準(zhǔn),一套叫UCS-2(Unicode-16),用2個(gè)字節(jié)為字符編碼,另一套叫UCS-4(Unicode-32),用4個(gè)字節(jié)為字符編碼。
以目前常用的UCS-2為例,它可以表示的字符數(shù)為2^16=65535,基本上可以容納所有的歐美字符和絕大部分的亞洲字符。
UTF-8的問(wèn)題后面會(huì)提到。
在Unicode里,所有的字符被一視同仁。漢字不再使用“兩個(gè)擴(kuò)展ASCII”,而是使用“1個(gè)Unicode”,注意,現(xiàn)在的漢字是“一個(gè)字符”了,于是,拆字、統(tǒng)計(jì)字?jǐn)?shù)這些問(wèn)題也就自然而然的解決了。
但是,這個(gè)世界不是理想的,不可能在一夜之間所有的系統(tǒng)都使用Unicode來(lái)處理字符,所以Unicode在誕生之日,就必須考慮一個(gè)嚴(yán)峻的問(wèn)題:和ASCII字符集之間的不兼容問(wèn)題。
我們知道,ASCII字符是單個(gè)字節(jié)的,比如“A”的ASCII是65。而Unicode是雙字節(jié)的,比如“A”的Unicode是0065,這就造成了一個(gè)非常大的問(wèn)題:以前處理ASCII的那套機(jī)制不能被用來(lái)處理Unicode了。
另一個(gè)更加嚴(yán)重的問(wèn)題是,C語(yǔ)言使用'