ANSI、MBCS與UNICODE

目前計算機中用得最廣泛的字符集及其編碼,是由美國國家標準局(ANSI)制定的ASCII碼(American Standard Code for Information Interchange,美國標準信息交換碼),它已被國際標準化組織(ISO)定爲國際標準,稱爲ISO 646標準。ASCII碼適用於所有拉丁文字,它用7位二進制數進行編碼(其最高位(bit7)被用做奇偶校驗位),可以表示128個字符。
第0~32號及第127號(共34個)是控制字符或通信專用字符,如控制符:LF(換行)、CR(回車)、FF(換頁)、DEL(刪除)、BEL(振鈴)等。
第33~126號(共94個)是字符,其中第48~57號爲0~9 10個阿拉伯數字;65~90號爲26個大寫英文字母,97~122號爲26個小寫英文字母,其餘爲一些標點符號、運算符號等。
ASCII碼佔用一個字節,準確地說,是7個比特。由於漢字出現在ASCII碼之後,所以漢字的編碼必須兼容ASCII碼。還有一個問題就是,漢字的數目很多,用簡單的1個字節根本無法表達(1個字節,撐死了只能表示256個字符,除掉ASCII碼,只有128個可用的了)。因此聰明的中國人決定採用2個字節來表達一個漢字。由於ASCII碼佔用7位的歷史原因,所以這種聰明的編碼方式規定:對於連續的2個字節,只有在2個字節的bit7都是1的情況下,才認爲這2個字節合起來表示一個漢字。這樣不同長度混排的編碼方法,通常被叫做"MBCS(Muilti-Bytes Charecter Set,多字節字符集)",如"中文ABC"這串文本,它所佔用的字節數可能就是:2×2+3=7,如圖4-12所示。
 
圖4-12  MBCS下中文與字
母的存儲長度
這樣的編碼挺好,而且與ASCII碼兼容。這種編碼被稱做GB2312(國標2312,GB就是國標的簡寫)。GB2312後來又擴展成了GBK(國標擴展碼),甚至GB18030。此外,不同的國家和地區都制定了不同的編碼標準,如:BIG5、JIS等編碼。不同編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字存儲在同一段編碼的文本中,UNICODE由此浮出水面。
爲了使國際間信息交流更加方便,國際標準化組織(ISO)制定了 UNICODE 字符集,爲各種語言中的每一個字符設定了統一併且唯一的數字編號,以滿足跨語言、跨平臺進行文本轉換、處理的要求。
UNICODE開始制訂時,計算機的存儲器容量極大地發展了,也就是說空間再也不成爲問題了。於是ISO直接規定必須用2個字節,也就是16位來統一表示所有的字符,對於ASCII裏的那些"半角"字符,UNICODE保持其原編碼不變,只是將其長度由原來的8位擴展爲16位,如英文字母"A",其編碼就會變成"00000000 01100001"。很顯然,由於"半角"英文符號只需要用到低8位,所以其高8位永遠是0。因此這種大氣的方案在保存純英文文本時會浪費一倍的空間。而其他文化和語言的字符則全部重新統一編碼。如:"中"的UNICODE爲"01001110 00101101"。
這樣一來,沒那麼多的麻煩事了,所有的字符都固定佔用2個字節。如"中文ABC",它所佔用的字節數就是:5×2=10,如圖4-13所示。所以,使用UNICODE編碼進行存放的字符也被稱做寬字節字符。
 
圖4-13  UNICODE下中文與字母的存儲長度
在標準C++中,可以這樣定義一個MBCS或者ANSI的字符串,即:
 
  1. char msg[] = "學習C++"
定義一個UNICODE的字符串,可以用L前綴,即:
  1. wchar_t msg[] = L"學習C++"
UNICODE統一了天下,但是客觀事實是,所有的應用程序(包括航空公司的訂單系統)不會一夜之間換用UNICODE編碼,所以程序員面對的新問題是:如何編寫自適應編碼的程序?如何完成各種編碼之間的轉換?
 
===============================
以上摘自《把脈VC++》第4.5.2小節的內容 ,轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章