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