Unicode
寬字符有很多種,Unicode只 是寬字符編碼的一種實現,每個字符用 16位 表示。
Unicode的產生是為了解決許多8位無法標識的東西。
ASCII
所以 wchar_t 數據類型和一個無符號整型一樣,都是 16位 寬。
wchar_t c = 'A' ;
變量 c 是一個 2 byte 的值0x0041,這是Unicode中字母A的代表。它在內存中的存儲是按照高位在后,低位在前存儲的。
wchar_t *p = L"Hello!";
那么 wchar_t *pw = L"Hello!"; iLength = strlen(pw); iLength = ?
寬字符版本的strlen函數被稱為 wcslen("string"),並定義在STRING.H 和 WCHAR.H 中。
在 WINNT.H 中定義了:
typedef wchar_t WCHAR; 用來定義 16位 的字符
typedef CHAR * PCHAR,* LPCH,* NPSTR, * PSTR;
這里的 PCHAR,LPCH,NPSTR,PSTR 都是CHAR * 的別名,以后定義一個指針就可以直接用別名了。
typedef WCHAR *PWCHAR,*LPWCH, *PWCH, *NWPSTR, *LPWSTR, *PWSTR;
另外,前綴 N 和 L 分別是表示"近"(near),和"遠"(long),指的是 16位 Windows系統中的兩種大小不同的指針
#ifdef UNICODE typedef WCHAR TCHAR, *PTCHAR ; typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ; typedef LPCWSTR LPCTSTR ; #else typedef char TCHAR, *PTCHAR ; typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ; typedef LPCSTR LPCTSTR ; #endif 同時用來選擇字符處理函數,例如WINUSER.H中: #ifdef UNICODE #define MessageBox MessageBoxW #else #define MessageBox MessageBoxA #endif
這 樣,我們只用一種類型(比如TCHAR)和一組函數(比如MessageBox)就方便地可以處理兩種編碼的程序,
而不用去條件判斷應該用char還是 wchar_t,
應該用MessageBoxA還是MessageBoxW。這些細節Windows.h等頭文件中已經為我們考慮了,
我們要做的只是在需要用Unicode時定義兩個符號。
另外提醒一下:
_UNICODE 是讓 C 函數使用 unicode
UNICODE 是讓 API 使用 unicode