windows 程序中支持两种类型的字符串编码:MBCS和Unicode, 程序中采用哪种类型的字符串编码取决于宏Unicode。MBCS字符串是以ANSI字符编码为基础的多字节字符串,而Unicode字符串则是宽字节编码的字符串。
char 型字符是ANSI型的数据,每个字符占有一个字节。
wchar_t 是基于Unicode的字符类型,每个字符占有两个字节(在windows系统中,如果没有特别强调,Unicode一般都是指UTF-16编码)。以上两种类型都是Microsoft run-time library所支持的数据类型。
为了方便基于上述两种类型的字符串所编写的程序之间的转换,微软定义一种“中间”型字符TCHAR,它是一种多字节字符类型,通过在相应的宏定义可以把它定义为ANSI类型或者Unicode类型字符。
CString 是基于TCHAR的动态数组,即CString 中存储的元素是TCHAR类型,是一种多字节字符串。
在头文件afxstr.h中有CString的定义
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;如果定义了UNICODE宏,则TCHAR与wchar_t等效,如果没有定义UNICODE宏,则TCHAR与char等效;
该定义在WinNT.h文件中。
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;
typedef __nullterminated CHAR *NPSTR, *LPSTR, *PSTR;
typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
#ifdef UNICODE // r_winnt
typedef WCHAR TCHAR, *PTCHAR;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
#else /* UNICODE */ // r_winnt
typedef char TCHAR, *PTCHAR;
typedef LPSTR PTSTR, LPTSTR, PUTSTR, LPUTSTR;
typedef LPCSTR PCTSTR, LPCTSTR, PCUTSTR, LPCUTSTR;
#endif /* UNICODE */由上面代码可知,如果定义了UNICODE开关(vs2010中,默认是开启的),则TCHAR类型则为WCHAR类型,否则为CHAR类型。
LPTSTR与LPCTSTR表示何种类型的字符串,取决于UNICODE宏的定义,如果定义了UNICODE宏,那么LPTSTR与LPCTSTR分别表示LPWSTR与LPCWSTR, 而LPWSTR与LPCWSTR分别表示指向WCHAR与CONST WCHAR类型字符串的指针,即是Unicode类型的字符串指针。
如果没有定义UNICODE宏,则LPTSTR与LPCTSTR分别表示LPSTR与LPCSTR, LPSTR与LPCSTR则分别定义为指向CHAR与CONST CHAR类型的字符串指针,即ANSI类型字符串指针。
在LPTSTR ,LPCTSTR与 LPSTR,LPCSTR命名中
L表示long,P表示point, C表示const,STR表示字符串。
在windows SDK函数中,如果函数的参数列表含有字符串参数,那么该函数通常两种版本。如对于MessageBoxEx函数有如下声明:
int MessageBoxEx( __in HWND hWnd, __in LPCTSTR lpText, __in LPCTSTR lpCaption, __in UINT uType, __in WORD wLanguageId );
MessageBoxExW版本用接收Unicode字符串类型参数,MessageBoxExA用于接收ANSI字符类型参数。
在用户代码中可能直接使用MessageBoxEx函数,该函数通过宏Unicode实现两种不同类型的函数选择。
在Winuser.h头文件中通过宏Unicode实现选择:
#ifdef UNICODE
#define MessageBoxEx MessageBoxExW
#else
#define MessageBoxEx MessageBoxExA
#endif // !UNICODE
从Windows NT起,Winodws的内核函数都需要Unicode字符串,如果调用函数时,向它传入ANSI字符串,那么函数首先会把字符串传入转换为Unicode字符串,再把结果传给操作系统。如果函数返回的是ANSI字符串,那么操作系统会把Unicode字符串转换为ANSI字符串,再把结果返回给我的应用程序。为了减少转换,提高效率,在我们的应用程序中,尽量使用Unicode字符串,如如下定义。
CString str1=L"Hello World";
CString str2 = _T("Hello World");
CString str3 = _TEXT("Hello World");参考文献《Windows核心编程》
本文深入探讨了Windows程序中使用的字符串编码类型,包括MBCS和Unicode,并解释了TCHAR、LPTSTR和LPCTSTR等类型如何根据UNICODE宏定义来表示ANSI或Unicode字符串。
8863

被折叠的 条评论
为什么被折叠?



