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開頭的通用字串操作函數。
六、舉個Unicode編程的例子
第一步:
開啟VC++6.0,建立基於對話方塊的工程Unicode,主對話方塊IDD_UNICODE_DIALOG中加入一個按鈕控制項,雙擊該控制項並添加該控制項的響應函數:
void CUnicodeDlg::OnButtonUnicode() { TCHAR* str1=_T("ANSI和
UNICODE編碼實驗"); m_disp=str1; UpdateData(FALSE);}
添加靜態文字框IDC_DISP,使用ClassWizard給該控制項添加CString類型變數m_disp。使用預設ANSI編碼環境編譯該工程,產生Unicode.exe。
第二步:修改系統內碼
開啟“控制台”,單擊“日期、時間、語言和地區設定”選項,在“日期、時間、語言和地區設定”視窗中繼續單擊“地區和語言選項”選項,彈出“地區和語 言選項”對話方塊。在該對話方塊中,單擊“進階”標籤,將“非Unicode的程式的語言”選項改為“日語”,單擊“應用”按鈕,
彈出的對話方塊單擊“是”,重新啟動電腦使設定生效。
運行Unicode.exe程式並單擊“Button1”按鈕,看,靜態文字框出現了亂碼。
第三步:
改為Unicode編碼環境編譯該工程,產生Unicode.exe。再次運行Unicode.exe程式並單擊“Unicode”按鈕。看到Unicode編碼的優勢了吧。
操作:
到底什麼是ANSI,什麼是UNICODE呢?其實這是兩種不同的編碼方式標準,ANSI中的字元採用8bit,而UNICODE中的字元採用16bit。8bit的ANSI編碼只能表示256種字元,表示26個英文字母是綽綽有餘的,但是表示漢字,韓國語,日語等有著成千上萬個字元的非西方字元肯定就不夠了,正是如此才引入了UNICODE標準。
在軟體開發中,特別是使用C語言的一些有關字串處理的函數,ANSI和UNICODE是區分是用的,那麼ANSI類型的字元和UNICODE類型的字元如何定義,如何使用呢?ANSI和UNICODE又如何轉換呢?
一.定義部分:
ANSI: char str[1024]; 可用字串處理函數:strcpy( ), strcat( ), strlen( )等等。UNICODE:wchar_tstr[1024];可用字串處理函數
二.可用函數:
ANSI:即 char, 可用字串處理函數:strcat( ),strcpy( ), strlen( )等以str打頭的函數。
UNICODE:即wchar_t 可用字串處理函數:wcscat(),wcscpy(),wcslen()等以wcs打頭的函數。
三.系統支援
Windows 98 :只支援ANSI。
Windows 2k :既支援ANSI又支援UNICODE。
Windows CE :只支援UNICODE。
說明
1. 在COM裡面只支援UNICODE。
2. Windows 2000整個OS系統都是基於UNICODE的,為此在windows 2000下使用ANSI是需要付出代價的,雖然在編碼上不用任何的轉換,但是這種轉化是隱藏的,是佔用系統資源的(CPU,記憶體)。
3. 在Windows 98下必須使用UNICODE,則需要自己手動的編碼切換。
三.如何區分:
在我們軟體開發中往往需要即支援ANSI又支援UNICODE,不可能在要求類型轉換的時候,重新改變字串的類型,和使用於字串上的操作函數。為此, 標準的C 運行期庫和Windows 提供了宏定義的方式。
在C語言裡面提供了 _UNICODE宏(有底線),在Windows裡面提供了UNICODE宏(無底線),只要定了_UNICODE宏和UNICODE宏,系統就會自動切換到UNICODE版本,否則,系統按照ANSI的方式進行編譯和運行。
只定義了宏並不能實現自動的轉換,他還需要一系列的字元定義支援。
1. TCHAR
如果定義了UNICODE宏則TCHAR被定義為wchar_t。
typedef wchar_t TCHAR;
否則TCHAR被定義為char
typedef char TCHAR;
2. LPTSTR
如果定義了UNICODE宏則LPTSTR被定義為LPWSTR。
typedef LPTSTR LPWSTR;
否則TCHAR被定義為char
typedef LPTSTR LPSTR;
說明: 在使用字串常量的時候需要使用_TEXT(“MyStr”)來支援系統的自動轉換。