1.Windows兩個字符集
ANSI(8位):Windows98及其以前版本,類似ASCII,佔一個字節。英文
Unicode(16位):Windows NT和Windows 2000,ANSI的超集,佔兩個字節。中文
2.兩種字符集對應的應用程序
基於ANSI的程序可以在Windows NT和Windows 2000上運行,稍慢;
基於Unicode的程序不能在Windows 98上運行,除非將每個傳遞給Windows的字符串由Unicode轉換爲ANSI格式。
3.編譯方式
如:若爲“Hello”,編譯器將從ANSI字符組成該字符串;
若爲L“Hello”,編譯器將用Unicode字符;
若爲_T"Hello",則爲MFC的_T宏。
如果定義了_UNICODE,那麼編譯器使用Unicode字符,否則,編譯器將使用ANSI字符。
Windows NT的所有與字符有關的函數都提供兩種方式的版本,而Windows 9x只支持ANSI方式。 如果你編譯一個程序爲ANSI方式,_T實際不起任何作用。而如果編譯一個程序爲UNICODE方式,則編譯器會把字符串以UNICODE方式保存。_T和_L的區別在於,_L不管你是以什麼方式編譯,一律以UNICODE方式保存。
LPSTR:32bit指針指向一個字符串,每個字符佔1字節
LPCSTR:32-bit指針指向一個常字符串,每個字符佔1字節
LPCTSTR:32-bit指針指向一個常字符串,每字符可能佔1字節或2字節,取決於Unicode是否定義
LPTSTR:32-bit指針每字符可能佔1字節或2字節,取決於Unicode是否定
4.使用
使用_T宏修飾字符串常量並不一定能使應用程序完全不關心其字符集,需注意:
a.將字符聲明爲TCHAR型而非char型。若定義了_UNICODE,TCHAR爲wchar_t,16位;若無定義_UNICODE,則TCHAR爲char。
b.不要用char*或wchar*聲明TCHAR字符串指針,而應用TCHAR*,或LPTSTR,LPCTSTR。
c.不要認爲一個字符只有8bit,可用sizeof(TCHAR)求緩衝區長度。
d.將對C運行時間庫(strcpy)中字符串的調用替換爲Windows頭文件Tchar.h(_tcscpy)中的對應宏。
5.實例
例1:使用ANSI字符集
char szMsg[256];
pWnd->GetWindowText(szMsg,sizeof(szMsg));
strcat(szMsg,"Hello");
MessageBox(szMsg);
例2:將以上代碼改爲與字符集無關
TCHAR szMsg[256];
pWnd->GetWindowText(szMsg,sizeof(szMsg)/sizeof(TCHAR));
_tstrcat(szMsg,_T("Hello"));
MessageBox(szMsg);