ASCII與Unicode
=========
一、ASCⅡ
1>. 關於ASCⅡ
ASCII(American Standard Code for Information Interchange,美國信息互換標准代碼)
ASCII一共包含128個字符, 包括: 33個控制符號, 1個空格, 32個符號, 10個數字, 26個小寫字母和26個大寫字母。每個ASCII字符采用7位二進制編碼的方式。
ASCII的優點:
十分可靠, 普遍扎根在我們的鍵盤、顯示器、系統硬件、打印機、操作系統等, 用途十分廣泛。
ASCII的缺點:
ASCII, 美國信息互換標准代碼, 美國原生, 不能滿足其他國家文字的需求, 例如, 中國的漢字?英國的英鎊符號(£)?等, 這些在ASCII都是找不到的。
2>. 對ASCII的擴展
由於ASCII不能很好的滿足其他國家文字的需求, 所以人們迫切希望能對ASCII進行改進。
①. 國際化標准組織的擴展方案
1967年, 國際化標准組織( ISO, International Organization for Standardization )推薦了ASCII的一個變種, 改動內容包括: 從ASCII中, 拿出 0x40('@'),、0x5B('[')、0x5C('\')、0x5D(']')、0x5E('^')、0x60(' ' ')、0x7B('{')、0x7C('¦')、0x7D('}')、0x7E('~')這10個符號保留給各個國家單獨使用。這顯然不是解決ASCII國際化的好方法, 首先, 其他國家將這些保留字符重新定義為自己國家需要的字符后, 那么國際上的一致性將不能得到保證, 此外, 10個保留字符遠遠不能滿足美國的東方的一些國家使用的象形文字需求, 比如我們中國的漢字。
②. IBM公司的擴展方案
IBM公司采用了使用8位二進制編碼方式來表示ASCII, 使用一個字節來儲存字符, 這樣, 相對於7位的ASCII就可以多出128個額外字符空位來補充ASCII。
IBM對ASCII的主要擴展為: 補充了一些重音字符、小寫希臘字母、塊圖字符和線圖字符。同時, 還將一些補充的字符分配到ASCII的一些不必要的控制字符上。
(注: 在操作系統還是字符模式的年代, 塊圖字符和線圖字符常用來被應用軟件裝飾自己的程序顯示)
③. 微軟公司的擴展方案
1985年11月, Windows 1.0發布, 微軟采用了自己定義的一套字符集, 這套字符集被稱為"ANSI字符集", 是基於ANSI和ISO標准的一個草案。
在MS-DOS 3.3時代(1987年4月), 微軟為了使不同國家的計算機都能正常的顯示字符, 微軟采用了代碼頁概念, 不同國家的字符被規定在不同的代碼頁上, 例如代碼頁第437頁為美國英語, 850頁為拉丁語-1。用戶只要將代碼頁設置到自己所在的國家就能正常的進行工作, 但是如果用戶嘗試着將自己的文檔拿到與另外一個使用不同代碼頁的用戶的計算機上進行修改時, 自己的文檔的某些字符將會顯示成其他字符, 這還算好, 有解決方案, 應用軟件可以通過將代碼頁信息儲存到文件中, 使用時再進行一些代碼頁的轉換。
但在后來, 隨着代碼頁數量的劇增, Windows版本的不斷升級, 代碼頁的混淆問題開始日益凸顯, DS-DOS的代碼頁和Windows的代碼頁以及其他Windows版本的系統發生了不兼容, 例如MS-DOS代碼頁第855頁西里爾語在Windows中的1251頁西里爾語或者Macintosh的第10007頁西里爾語還都不一樣。
微軟為了解決東方一些國家使用的象形文字問題, 使用了雙字節字符集, 這些字符集同樣在不同的代碼頁, 代碼頁936(簡體中文)、949(韓文)、950(繁體中文)以及932(日文)。微軟的這個雙字節字符集和你象形的可能有所不同, 在這個雙字節字符集中, 前128個字符仍然是ASCII(1字節), 較高的128個擴展字符以跟隨第二個字節的方式用來表示象形文字(這兩個字節被稱為前導字節和尾隨字節)。
所以在這個代碼頁中, 有一個字節的字符, 還有2個字節的字符, 這就導致了兩個嚴重的問題:
1>. 在一段字符串中, 字符串的長度不能根據字節的個數確定, 要想確定字符串的長度必須檢查每個字節是不是雙字節字符的前導字節。
2>. 通過任意指向字符串中的一個指針, 無法知道前一個字符的地址, 通常要回到字符串的開始, 一直解析到指針所在的位置。
二、Unicode
對ASCII擴展的過程中, 沒有能夠找到一個徹底解決世界上所有書面文字的表示方法, 很顯然, 1個字節, 256個字符是無法表示世界上所有的書面文字的, 因此, Unicode誕生了。
Unicode使用16位(2字節)的二進制編碼方式來表示字符, 我們知道, 16位最多能夠表示65536個字符, 65536個字符對於世界上的所有書面文字以及一些特殊符號來說已經足夠用了。在Unicode中, 不同國家使用不同的代碼段, 例如, 0x0530 - 0x058F為亞美尼亞語 (Armenian) 、0x0600 - 0x06FF為阿拉伯文 (Arabic) 、0x0E00 - 0x0E7F為泰文 (Thai) 、0x2700 - 0x27BF為印刷符號 (Dingbats) 、0x4E00 - 0x9FBF為中文。
Unicode的優點:
只有一個字符集, 避免了二義性, 能夠滿足跨語言、跨平台進行文本轉換、處理的要求。
Unicode的缺點:
Unicode字符的字符串比ASCII字符串占用的內存大兩倍。(筆者認為, 隨着計算機性能的不斷提高, 內存和外存容量的不斷增加, Unicode這一缺點可以慢慢忽略)