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