Windows、字符集和_T宏

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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章