在VC60下,默認方式下建立的是ANSI編碼的工程(注:編譯的exe內部,其資源字符是以UNICODE保存),建立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頁的Category:Output類別的Entry Point裡填上wWinMainCRTStartup。
1、用THCAR代替char
2、字符串加_T(""),如_T("你好")
3、用_tcscpy等代替strcpy等
ANSI操作函數以str開頭,如strcpy(),strcat(),strlen();
Unicode操作函數以wcs開頭,如wcscpy,wcscpy(),wcslen();
ANSI/Unicode互為兼容的操作函數以_tcs開頭 _tcscpy(C運行期庫);
ANSI/Unicode互為兼容的操作函數以lstr開頭 lstrcpy(Windows函數);
考慮ANSI和Unicode的兼容,我們需要使用以_tcs開頭或lstr開頭的通用字符串操作函數。
這樣,你在ANSI/UNICODE環境下編譯時,可以不修改代碼。
1、在ANSI下,如果程序本身產生的字符(串),如在代碼中直接賦值的CString str = _T("你好"),不需要轉換,但是,字符(串)是從其它地方來的,如讀取UNICODE編碼的文件,通信接收的UNICODE數據,則需要轉換,轉換使用上面兩個函數。
2、同理,在UNICODE下,如果程序本身產生的字符(串),如在代碼中直接賦值的CString str = _T("你好"),不需要轉換,但是,字符(串)是從其它地方來的,如讀取ANSI編碼的文件,通信接收的ANSI數據,則需要轉換,轉換使用上面兩個函數。
3、不管是ANSI,還是UNICODE,在資源中的字符串,如String Table中的、對話框的靜態文本,都不需要轉換,因為它們編譯後是以UNICODE保存在.exe中的。
對話框上的漢字,只要是簡繁同形的,同一個.exe運行在簡體Windows和繁體Windows下都可以正常顯示,當然兩者必須要有對應的字體(庫),都用System字體是可以的,或者簡體Windows下用“宋體”,繁體Windows下用“新細明體”。簡體的“中”和繁體的“中”字體相同,是簡繁同形,簡體的“國”和繁體的“國”字形不同,是簡繁異形。
4、另外,同一個字符串在ANSI和UNICODE下計數個數不同。如“123你好”,在ANSI下是7個字符,在UNICODE下是5個字符。使用CString 的.GetLength()時要特別注意。