Unicode編碼介紹
先從ASCII說起。ASCII是用來表示英文字符的一種編碼規(guī)范,每個(gè)ASCII字符占用1個(gè)字節(jié)(8bits)
因此,ASCII編碼可以表示的最大字符數(shù)是256,其實(shí)英文字符并沒有那么多,一般只用前128個(gè)(最高位為0),其中包括了控制字符、數(shù)字、大小寫字母和其他一些符號。
而最高位為1的另128個(gè)字符被成為“擴(kuò)展ASCII”,一般用來存放英文的制表符、部分音標(biāo)字符等等的一些其他符號
這種字符編碼規(guī)范顯然用來處理英文沒有什么問題。(實(shí)際上也可以用來處理法文、德文等一些其他的西歐字符,但是不能和英文通用),但是面對中文、阿拉伯文之類復(fù)雜的文字,255個(gè)字符顯然不夠用
于是,各個(gè)國家紛紛制定了自己的文字編碼規(guī)范,其中中文的文字編碼規(guī)范叫做“GB2312-80”,它是和ASCII兼容的一種編碼規(guī)范,其實(shí)就是利用擴(kuò)展ASCII沒有真正標(biāo)準(zhǔn)化這一點(diǎn),把一個(gè)中文字符用兩個(gè)擴(kuò)展ASCII字符來表示。
但是這個(gè)方法有問題,最大的問題就是,中文文字沒有真正屬于自己的編碼,因?yàn)閿U(kuò)展ASCII碼雖然沒有真正的標(biāo)準(zhǔn)化,但是PC里的ASCII碼還是有一個(gè)事實(shí)標(biāo)準(zhǔn)的(存放著英文制表符),所以很多軟件利用這些符號來畫表格。這樣的軟件用到中文系統(tǒng)中,這些表格符就會(huì)被誤認(rèn)作中文字,破壞版面。而且,統(tǒng)計(jì)中英文混合字符串中的字?jǐn)?shù),也是比較復(fù)雜的,我們必須判斷一個(gè)ASCII碼是否擴(kuò)展,以及它的下一個(gè)ASCII是否擴(kuò)展,然后才“猜”那可能是一個(gè)中文字。
總之當(dāng)時(shí)處理中文是很痛苦的。而更痛苦的是GB2312是國家標(biāo)準(zhǔn),臺灣當(dāng)時(shí)有一個(gè)Big5編碼標(biāo)準(zhǔn),很多編碼和GB是相同的,所以……,嘿嘿。
這時(shí)候,我們就知道,要真正解決中文問題,不能從擴(kuò)展ASCII的角度入手,也不能僅靠中國一家來解決。而必須有一個(gè)全新的編碼系統(tǒng),這個(gè)系統(tǒng)要可以將中文、英文、法文、德文……等等所有的文字統(tǒng)一起來考慮,為每個(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的問題后面會(huì)提到。
在Unicode里,所有的字符被一視同仁。漢字不再使用“兩個(gè)擴(kuò)展ASCII”,而是使用“1個(gè)Unicode”,注意,現(xiàn)在的漢字是“一個(gè)字符”了,于是,拆字、統(tǒng)計(jì)字?jǐn)?shù)這些問題也就自然而然的解決了。
但是,這個(gè)世界不是理想的,不可能在一夜之間所有的系統(tǒng)都使用Unicode來處理字符,所以Unicode在誕生之日,就必須考慮一個(gè)嚴(yán)峻的問題:和ASCII字符集之間的不兼容問題。
我們知道,ASCII字符是單個(gè)字節(jié)的,比如“A”的ASCII是65。而Unicode是雙字節(jié)的,比如“A”的Unicode是0065,這就造成了一個(gè)非常大的問題:以前處理ASCII的那套機(jī)制不能被用來處理Unicode了。
另一個(gè)更加嚴(yán)重的問題是,C語言使用'看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();