1. 程式人生 > >ASCII、GB2312和Unicode

ASCII、GB2312和Unicode

  ASCII是用來表示英文字元的一種編碼規範(編碼規範確定了字元到編碼的映 射),它一共可以表示256種不同的編碼,每個編碼儲存起來佔一個位元組。其中低128個編碼用來表示大小寫字母、數字、控制字元等,而高128個編碼則被 稱做“擴充套件ASCII”(最高位為1),一般用來存放英文的製表符、部分音標字元等等的一些其他符號。

  早先的漢字編碼就利用了擴充套件ASCII,它們利用兩個ASCII碼來編碼一個漢字。由於歷史的原因,在Unicode之前,一共存在過3套中文編碼標準:

  GB2312-80,是中國大陸使用的國家標準,其中一共編碼了6763個常用簡體漢字。Big5,是臺灣使用的編碼標準,編碼了臺灣使用的繁體漢字,大概有8千多個。HKSCS,是中國香港使用的編碼標準,字型也是繁體,但跟Big5有所不同。 

  這3套編碼標準都採用了兩個擴充套件ASCII的方法,但是這幾套編碼互不相容,而且編碼區間也各有不同。因此在同一個系統中同時顯示GB和Big5基本上是不可能的。

  後來,由於各方面的原因,國際上又制定了針對中文的統一字符集GBK和GB18030,其中GBK已經在Windows、Linux等多種作業系統中被實現。 

  GBK相容GB2312,並增加了大量不常用漢字,還加入了幾乎所有的Big5中的繁體漢字。但是GBK中的繁體漢字和Big5中的幾乎不相容。 

  GB18030相當於是GBK的超集,比GBK包含的字元更多。據我所知目前還沒有作業系統直接支援GB18030。

  這之後,Unicode出現了,在Windows2K,XP中,Unicode已經成了OS的標準內碼。

  Unicode編碼規範有兩套標準,一套叫UCS-2(Unicode-16),另一套叫UCS-4(Unicode-32)。

  以目前常用的UCS-2為例,它可以表示的字元數為2^16=65535(編碼數),基本上可以容納所有的歐美字元和絕大部分的亞洲字元 。

  在Unicode裡,所有的字元被一視同仁。漢字不再使用“兩個擴充套件ASCII”,而是使用“1個Unicode”,注意,現在的漢字是“一個字元”了,於是,拆字、統計字數這些問題也就自然而然的解決了。

  但是,這個世界不是理想的,不可能在一夜之間所有的系統都使用Unicode來處理字元,所以Unicode在誕生之日,就必須考慮一個嚴峻的問 題:和ASCII字符集之間的不相容問題。我們知道,ASCII字元是單個位元組的,比如“A”的ASCII是65。而“A”的Unicode是0065, 這就造成了一個非常大的問題:以前處理ASCII的那套機制不能被用來處理Unicode了 。 

  另一個更加嚴重的問題是,C語言使用'/0'(ASCII碼0)作為字串結尾,而Unicode裡恰恰有很多字元都有一個位元組為0,這樣一來,C語言的字串函式將無法正常處理Unicode,除非把世界上所有用C寫的程式以及他們所用的函式庫全部換掉。

  UTF(UCS Transformation Format)是將Unicode編碼規範和計算機中實際儲存的編碼對應起來的一個規則。現在流行的UTF有2種:UTF-8和UTF-16 。 

  其中UTF-16和上面提到的Unicode編碼規範本身是一致的,這裡不多說了。而UTF-8不同,UTF-8有點類似於Haffman編碼,它用 1-6個位元組來儲存一個編碼,其中英文字元仍然跟ASCII編碼一樣,用一個位元組來儲存,因此原先的函式庫可以繼續使用。而中文的編碼範圍是在 0080-07FF之間,因此是2個位元組表示(但這兩個位元組和GB編碼的兩個位元組是不同的),用專門的Unicode處理類可以對UTF編碼進行處理。 這種規則可以和ASCII編碼保持最大程度的相容。