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