按:這是早前發(fā)表在我個人其他博客上的文章,現(xiàn)在根據(jù)文本分類和網(wǎng)頁設(shè)計的需要進行重新的匯編和整理,也加入了一些新東西,希望對感興趣的人有所幫助。
ASCII及相關(guān)標(biāo)準(zhǔn)
地球人都知道ASCII就是美國標(biāo)準(zhǔn)信息交換碼的縮寫,也知道ASCII規(guī)定用7位二進制數(shù)字來表示英文字符,ASCII被定為國際標(biāo)準(zhǔn)之后的代號為ISO-646。由于ASCII碼只使用了7個二進制位,也就是說一個字節(jié)可以表示的256個數(shù)字中,它僅使用了0~127這128個碼位,剩下的128個碼位便可以用來做擴展,用來表示一些特定語言所獨有的字符,因此對這多余的128個碼位的不同擴展,就形成了一系列ISO-8859-*的標(biāo)準(zhǔn)。例如為英語作了專門擴展的字符集編碼標(biāo)準(zhǔn)編號為ISO-8859-1,也叫做Latin-1,為希臘語所作的擴展編號為ISO-8859-7等,完整的列表可以參考《Java Internationalization》一書。
Unicode與UCS
整個Unicode項目是由多家計算機軟件公司,還包括一些出版行業(yè)的公司共同發(fā)起的,從上世紀(jì)八十年代就已經(jīng)開始。地球人都知道,對于日文,漢字來說,256個碼位是遠(yuǎn)遠(yuǎn)不夠用的(當(dāng)然,在當(dāng)時并不是地球人都知道,起碼設(shè)計計算機的老美們就不知道,甚至直到今天,還有老美以為米國是世界上唯一的國家)。解決方法很直觀也很明顯,那就是采用碼位多到足夠包含所需字符數(shù)量的編碼方案(即俗話說的頭痛醫(yī)頭,腳痛醫(yī)腳嘛)。這也是Unicode的目標(biāo)之一,能夠包含世界上所有語言的字符(包括漢字,日文,數(shù)學(xué)符號,音樂符號,還包括各種奇奇怪怪看也看不懂的東西比如象形文字,甲骨文 ,三個代表,科學(xué)發(fā)展觀等等,笑),這個理想,可以說很遠(yuǎn)大,但很快被發(fā)現(xiàn)僅靠Unicode原先的設(shè)計無法實現(xiàn)。Unicode的另一個設(shè)計目標(biāo),對今天影響深遠(yuǎn),那就是對所有字符都采用16位編碼(即用一個大小不超過2的16次方的整數(shù)數(shù)字給每個字符編號,注意從這個意義上也可以看出,Unicode是一種編碼字符集,而非字符集編碼)。說這個設(shè)計目標(biāo)對現(xiàn)今影響深遠(yuǎn),完全不是表揚,因為到后來連Unicode的設(shè)計者也發(fā)現(xiàn),16位編碼僅有65536個碼位,遠(yuǎn)遠(yuǎn)不能容納世界上所有的字符,但當(dāng)意識到這個問題的時候,Unicode大部分的規(guī)范已經(jīng)制定完畢,也有相當(dāng)程度的普及,完全推倒重來是不現(xiàn)實的。這成了一個遺留問題,也是surrogate pair這種蹩腳解決方案的發(fā)端。
無獨有偶,在1984年,喜歡以繁多的編號糊弄群眾的國際標(biāo)準(zhǔn)化組織ISO也開始著手制定解決不同語言字符數(shù)量太大問題的解決方案,這一方案被稱為Universal Character Set(UCS),正式的編號是ISO-10646(記得么,ASCII是ISO-646,不知這種安排是否是故意的)。還是ISO高瞻遠(yuǎn)矚,一開始就確定了UCS是一個31位的編碼字符集(即用一個大小不超過2的31次方的整數(shù)數(shù)字為每個字符編號),這回真的足以容納古往今來所有國家,所有語言所包含的字符了(是的,任何國家,任何小語種都包括,也不管這些國家是與臺灣建交還是與中國大陸建交,是擁護民主制度還是實行恐怖主義,所以說科學(xué)無國界)。雖然后來他們意識到,2的31次方個碼位又實在太多了……
天下大勢,分久必合。無論Unicode還是UCS,最初的目的都是杜絕各種各樣名目繁多形式各異互不兼容老死不相往來的私用擴展編碼(好啰嗦的一句話),結(jié)果兩方確立標(biāo)準(zhǔn)的同時(最初時這兩個標(biāo)準(zhǔn)是不兼容的),又形成了割據(jù),這對建設(shè)和諧社會是不利的,違反當(dāng)今世界和平與發(fā)展的主旋律,中國政府一向反對任何形式的霸權(quán)主義和強權(quán)政治,對以米國為首的發(fā)達(dá)國家……扯遠(yuǎn)了扯遠(yuǎn)了。1991年,Unicode聯(lián)盟與ISO的工作組終于開始討論Unicode與UCS的合并問題,雖然其后的合并進行了很多年,Unicode初版規(guī)范中的很多編碼都需要被改寫,UCS也需要對碼空間的使用進行必要限制,但成果是喜人的。最終,兩者統(tǒng)一了抽象字符集(即任何一個在Unicode中存在的字符,在UCS中也存在),且最靠前的65535個字符也統(tǒng)一了字符的編碼。對于碼空間,兩者同意以一百一十萬為限(即兩者都認(rèn)為雖然65536不夠,但2的31次方又太大,一百一十萬是個雙方都可接受的碼空間大小,也夠用,當(dāng)然,這里說的一百一十萬只是個約數(shù)),Unicode將碼空間擴展到了一百一十萬,而UCS將永久性的不使用一百一十萬以后的碼位。也就是說,現(xiàn)在再講Unicode只包含65536個字符是不對的。除了對已經(jīng)定義的字符進行統(tǒng)一外,Unicode聯(lián)盟與ISO工作組也同意今后任何的擴展工作兩者均保持同步,因此雖然從歷史的意義上講Unicode與UCS不是一回事(甚至細(xì)節(jié)上說也不是一回事),但現(xiàn)在提起Unicode,指代兩者均無不妥。