工程使用Unicode編碼方式編譯。
使用Unicode編碼的好處
使用Unicode編碼可以使您的工程同時支持多種語言,使您的工程國際化。
另外,Windows NT是使用Unicode進行開發的,整個系統都是基於Unicode的。如果調用壹個API函數並給它傳遞壹個ANSI(ASCII字符集以及由此派生並兼容的字符集,如:GB2312,通常稱為ANSI字符集)字符串,那麽系統首先要將字符串轉換成Unicode,然後將Unicode字符串傳遞給操作系統。如果希望函數返回ANSI字符串,系統就會首先將Unicode字符串轉換成ANSI字符串,然後將結果返回給您的應用程序。進行這些字符串的轉換需要占用系統的時間和內存。如果用Unicode來開發應用程序,就能夠使您的應用程序更加有效地運行。
VC++6.0中編寫Unicode編碼的應用程序
VC++ 6.0支持Unicode編程,但默認的是ANSI,所以開發人員只需要稍微改變壹下編寫代碼的習慣便可以輕松編寫支持UNICODE的應用程序。
使用VC++ 6.0進行Unicode編程主要做以下幾項工作:
1、為工程添加UNICODE和_UNICODE預處理選項。
具體步驟:打開[工程]->[設置…]對話框,在C/C++標簽對話框的“預處理程序定義”中去除_MBCS,加上_UNICODE,UNICODE。(註意中間用逗號隔開)
在沒有定義UNICODE和_UNICODE時,所有函數和類型都默認使用ANSI的版本;在定義了UNICODE和_UNICODE之後,所有的MFC類和Windows API都變成了寬字節版本了。
2、設置程序入口點
因為MFC應用程序有針對Unicode專用的程序入口點,我們要設置entry point。否則就會出現連接錯誤。
設置entry point的方法是:打開[工程]->[設置…]對話框,在Link頁的Output類別的Entry Point裏填上wWinMainCRTStartup。
3、使用ANSI/Unicode通用數據類型
微軟提供了壹些ANSI和Unicode兼容的通用數據類型,我們最常用的數據類型有_T ,TCHAR,LPTSTR,LPCTSTR。
順便說壹下,LPCTSTR和const TCHAR*是完全等同的。其中L表示long指針,這是為了兼容Windows 3.1等16位操作系統遺留下來的,在Win32 中以及其它的32位操作系統中,long指針和near指針及far修飾符都是為了兼容的作用,沒有實際意義。P(pointer)表示這是壹個指針;C(const)表示是壹個常量;T(_T宏)表示兼容ANSI和Unicode,STR(string)表示這個變量是壹個字符串。綜上可以看出,LPCTSTR表示壹個指向常固定地址的可以根據壹些宏定義改變語義的字符串。比如:
TCHAR* szText=_T(“Hello!”);
TCHAR szText[]=_T(“I Love You”);
LPCTSTR lpszText=_T(“大家好!”);
使用函數中的參數最好也要有變化,比如:MessageBox(_T(“妳好”));
其實,在上面的語句中,即使您不加_T宏,MessageBox函數也會自動把“妳好”字符串進行強制轉換。但我還是推薦您使用_T宏,以表示您有Unicode編碼意識。
4、修改字符串運算問題
壹些字符串操作函數需要獲取字符串的字符數(sizeof(szBuffer)/sizeof(TCHAR)),而另壹些函數可能需要獲取字符串的字節數sizeof(szBuffer)。您應該註意該問題並仔細分析字符串操作函數,以確定能夠得到正確的結果。
ANSI操作函數以str開頭,如strcpy(),strcat(),strlen();
Unicode操作函數以wcs開頭,如wcscpy,wcscpy(),wcslen();
ANSI/Unicode操作函數以_tcs開頭 _tcscpy(C運行期庫);
ANSI/Unicode操作函數以lstr開頭 lstrcpy(Windows函數);
考慮ANSI和Unicode的兼容,我們需要使用以_tcs開頭或lstr開頭的通用字符串操作函數。