首先說(shuō)說(shuō)
ASCII碼吧,計(jì)算機(jī)在外國(guó)誕生后,大家要想怎么吧characters input給計(jì)算機(jī),他們就定了ASCII,現(xiàn)在有人抱怨老美太小氣,只設(shè)計(jì)了128個(gè),其實(shí)不然。試想想當(dāng)時(shí)的環(huán)境,一是他們無(wú)法預(yù)料計(jì)算機(jī)能像現(xiàn)在這樣普及,二是存儲(chǔ)設(shè)備還都不成熟,成本爆高。所以導(dǎo)致后來(lái)的局面,也就是ISO和unicode兩種字符集,分別是UCS-4(4個(gè)字節(jié))和unicode 1.0(2個(gè)字節(jié)),但這種定長(zhǎng)的導(dǎo)致英語(yǔ)國(guó)家不答應(yīng)了,平時(shí)字符都是一個(gè)byte,現(xiàn)在突然編程2個(gè)甚至是4個(gè),還有后來(lái)加入新的字符后就更亂了,最后兩個(gè)組織整合了,整個(gè)世界終于安靜了。
在這我想澄清個(gè)概念,就是大家不要把unicode和utf-8, utf-16, utf-32搞亂了,首先unicode是一套標(biāo)準(zhǔn)的字符集,基本包括了大多數(shù)的文字了,可以在這個(gè)路徑下載最新的字符表http://www.unicode.org/ ,utf-7,8等都是基于這個(gè)字符集的一些編碼算法。在unicode設(shè)計(jì)的時(shí)候把ASCII碼的128個(gè)作為unicode的前128個(gè)。那么現(xiàn)在最最最流行的也就是UTF-8的編碼了,它的算法思想是:
U-00000000 - U-0000007F: 0xxxxxxx ASCII碼
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
比如我在codeCharts里面找到這個(gè)字符?(010e),那么它的UTF-8結(jié)果是:
1 0000 1110 -------> 110 00 100 10 001110 C48E 就這么簡(jiǎn)單了,有沒(méi)有。
這里我還想引入一個(gè)庫(kù)libiconv,可以說(shuō)是一個(gè)萬(wàn)能的轉(zhuǎn)換編碼的工具把,去網(wǎng)站http://www.gnu.org/software/libiconv/ 了解詳情,它目前支持的字符編碼不下30種,常用的都有了。那么有了這個(gè)庫(kù)以后呢,大家可以在遇到已知輸入多種編碼時(shí),可以用它來(lái)轉(zhuǎn)成一種類(lèi)型的編碼(utf-8),然后做處理。VCard的解析我就是就是這樣解決的。