LPCTSTR ,LPTSTR ,LPCSTR, LPSTR, CString

本文深入探讨了Windows程序中使用的字符串编码类型,包括MBCS和Unicode,并解释了TCHAR、LPTSTR和LPCTSTR等类型如何根据UNICODE宏定义来表示ANSI或Unicode字符串。
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核心编程》
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值