一、什麼是Unicode
先從ASCII說起,ASCII是用來表示英文字元的一種編碼規範。每個ASCII字元佔用1個位元組,因此,ASCII編碼可以表示的最大字元數是255(00H—FFH)。其實,英文字元並沒有那麼多,一般只用前128個(00H—7FH,最高位為0),其中包括了控制字元、數字、大小寫字母和其它一些符號。而最高位為1的另128個字元(80H—FFH)被稱為“擴充ASCII”,一般用來存放英文的定位字元、部分音標字元等等的一些其它符號。
這種字元編碼規則顯然用來處理英文沒有什麼問題。但是面對中文、阿拉伯文等複雜的文字,255個字元顯然不夠用。
於是,各個國家紛紛制定了自己的文字編碼規範,其中中文的文字編碼規範叫做“GB2312—80”,它是和ASCII相容的一種編碼規範,其實就是利用擴充ASCII沒有真正標準化這一點,把一個中文字元用兩個擴充ASCII字元來表示,以區分ASCII碼部分。
但是這個方法有問題,最大的問題就是中文的文字編碼和擴充ASCII碼有重疊。而很多軟體利用擴充ASCII碼的英文定位字元來畫表格,這樣的軟體用到中文系統中,這些表格就會被誤認作中文字元,出現亂碼。
另外,由於各國和各地區都有自己的文字編碼規則,它們互相衝突,這給各國和各地區交換資訊帶來了很大的麻煩。
要真正解決這個問題,不能從擴充ASCII的角度入手,而必須有一個全新的編碼系統,這個系統要可以將中文、法文、德文……等等所有的文字統一起來考慮,為每一個文字都分配一個單獨的編碼。
於是,Unicode誕生了。
Unicode也是一種字元編碼方法,它佔用兩個位元組(0000H—FFFFH),容納65536個字元,這完全可以容納全世界所有語言文字的編碼。
在Unicode裡,所有的字元被一視同仁,漢字不再使用“兩個擴充ASCII”,而是使用“1個Unicode”,也就是說,所有的文字都按一個字元來處理,它們都有一個唯一的Unicode碼。
二、使用Unicode編碼的好處
使用Unicode編碼可以使您的工程同時支援多種語言,使您的工程國際化。
另外,Windows NT是使用Unicode進行開發的,整個系統都是基於Unicode的。如果調用一個API函數並給它傳遞一個ANSI(ASCII字元集以及由此派生併兼容的字元集,如:GB2312,通常稱為ANSI字元集)字串,那麼系統首先要將字串轉換成Unicode,然後將Unicode字串傳遞給作業系統。如果希望函數返回ANSI字串,系統就會首先將Unicode字串轉換成ANSI字串,然後將結果返回給您的應用程式。進行這些字串的轉換需要佔用系統的時間和記憶體。如果用Unicode來開發應用程式,就能夠使您的應用程式更加有效地運行。
下面例舉幾個字元的編碼以簡單示範ANSI和Unicode的區別:
| 字元 |
A |
N |
和 |
| ANSI碼 |
41H |
4eH |
cdbaH |
| Unicode碼 |
0041H |
004eH |
548cH |
三、使用C++進行Unicode編程
對寬字元的支援其實是ANSI C標準的一部分,用以支援多位元組表示一個字元。寬字元和Unicode並不完全等同,Unicode只是寬字元的一種編碼方式。
1、寬字元的定義
在ANSI中,一個字元(char)的長度為一個位元組(Byte)。使用Unicode時,一個字元佔據一個字,C++在wchar.h標頭檔中定義了最基本的寬字元類型wchar_t:
typedef unsigned short wchar_t;
從這裡我們可以清楚地看到,所謂的寬字元就是無符號短整數。
2、常量寬字元串
對C++程式員而言,構造字串常量是一項經常性的工作。那麼,如何構造寬字元字串常量呢?很簡單,只要在字串常量前加上一個大寫的L就可以了,比如:
wchar_t *str1=L" Hello";
這個L非常重要,只有帶上它,編譯器才知道你要將字串存成一個字元一個字。還要注意,在L和字串之間不能有空格。