W版本和A版本的Win32API
A:ANSI字元集; W:wide Unicode字元集。windows支援Unicode和ANSI編碼的字元。
在User32.dll中匯出的函數實際上沒有MessageBox,只有MessageBoxA和MessageBoxW,這兩者是同一個API,實現了同樣的功能。不同的是,MessageBoxA以多位元組字串作為參數輸入,MessateBoxW以Unicode字串作為參數輸入。但如果在編寫程式時,使用的字元集與代碼中使用的函數不一致、定義的字串變數不相容,將會引起編譯錯誤或者運行程式顯示亂碼,甚至可能引起程式運行錯誤,這一點需要引起注意。
Unicode字元集和多位元組字元集
多位元組字元集:MBCS(Multi-Byte Character System),即熟知的ANSI字元集。使用單位元組方式編。ANSI字元集,它的正式名稱應該是MBCS(Multi-Byte Chactacter System,即多位元組字元系統)。
Unicode(wideCharacter-set):寬位元組字元集(統一碼,萬國碼)使用雙位元組編碼,utf-8是其子。
Windows既可以使用Unicode字元集又可以使用傳統的字元集(如多位元組編碼)來實現對多種語言的支援,以適應國際市場的要求。與傳統的字元集編碼相比,Unicode是世界通用的字元編碼標準,使用16位元據表示一個字元,一共可以表示65535種字元。傳統的字元集,如Windows ASNI字元集,使用8位元據或將相鄰的兩個8位的資料群組合在一起表示特殊的語言字元。當人們在看網頁或文檔時,有時出現亂碼,通常他使用了ANSI字元集,應改為Unicode統一碼字元集,畢竟他是世界通用的。
- ANSI 操作函數以str開頭 strcpy
- Unicode 操作函數以wcs開頭 wcscpy
- MBCS 操作函數以_mbs開頭 _mbscpy
Win32中的字串
在C,C++語言中沒有字串這種資料類型,表示字串通常使用字元指標或字元數組。
|
ANSI |
Unicode |
ANSI/Unicode根據環境來確定 |
字元 |
CHAR char |
WCHAR wchar_t |
TCHAR |
字串 |
LPSTR char* |
LPWSTR wchar_t* |
LPTSTR |
常量字串 |
LPCSTR |
LPCWSTR |
LPCTSTR |
字串初始化 |
"string" |
L"string" |
TEXT("string") |
修改字元集:項目屬性->常規->字元集:使用Unicode的字元集、使用多位元組字元集。
一般,建立工程預設的字元集都是Unicode的(但建立的空項目預設為ANSI)。為此,我們在定義字串時,應該常用LPTSTR類型,及TEXT宏,_T宏與TEXT宏相同,不過要添加tchar.h標頭檔。
- 對於MBCS字串串連,複製,比較,求長運算為:strcat,strcpy,strcmp,strlen
- 對於Unicode字串串連,複製,比較,求長運算為:wcscat,wcscpy,wcscmp,wcslen;wcs(wide character-set)寬位元組字元集
- 根據開發環境的設定來自動適應:_tcscat,_tcscpy,_tcscmp,_tcslen
它們之間的相互轉換
LPWSTR->LPTSTR: W2T();
LPTSTR->LPWSTR: T2W();
LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();
ANSI->UNICODE: A2W();
UNICODE->ANSI: W2A();