LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别

LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的意义及区别 :
Windows下的程序设计可以支持ANSI和Unicode两种编码方法的字符串,具体使用哪种就要看定义了MBCS宏还是Unicode宏。
MBCS宏对应的字符串指针为LPSTR(即char*),Unicode对应的指针为LPWSTR(即wchar_t*)。为了写程序的方便,
微软定义了类型LPTSTR,在MBCS下它表示char*,在Unicode下它表示wchar_t*,这就可以重定义一个宏进行不同字
符集的转换了。简单地说就是:ANSI编码方式一个字符占一个字节,unicode编码方式一个字符占2个字节。所以LPWSTR及LPCWSTR
我们看到以上着两种类型中都有W,w代表wide(宽)也就是一个字符占两个字节的意思。


如下是从MFC库中拷来的:
#ifdef UNICODE

    typedef LPWSTR LPTSTR;

    typedef LPCWSTR LPCTSTR;

#else

    typedef LPSTR LPTSTR;

    typedef LPCSTR LPCTSTR;

#endif
由上分析可知:
LPSTR:即 char *,指向以'/0'结尾的8位(单字节)ANSI字符数组指针

LPWSTR:即wchar_t *,指向'/0'结尾的16位(双字节)Unicode字符数组指针

 

LPCSTR:即const char *

LPCWSTR:即const wchar_t *
也就是:
LPTSTR:LPSTR、LPWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI

LPCTSTR: LPCSTR、LPCWSTR两者二选一,取决于是否宏定义了UNICODE或ANSI,

_T是一个适配宏。当定义了_UNICODE时,_T和L相同;否则,_T的字符串采用ANSI编码方式。
所以我们可以到msdn中查看一下_TCHAR得到结果如下:
Generic-Text
Data Type Name SBCS (_UNICODE,_MBCS Not Defined)     _MBCSDefined          _UNICODE Defined
_TCHAR                              char                  char                   wchar_t
也即是说见到_T开头的类型我们要看是否定义了unicode   如果是则_TCHAR = wchar_t  否则_TCHAR=char

到此我们就很清楚LPSTR、LPCSTR、LPTSTR、LPCTSTR、LPWSTR及LPCWSTR的关系了。那么他们之间如何进行转换呢?
比如我们在编写windows程序用到 MessageBox(hwnd,L"是否真的结束?",L"weixin",MB_YESNO)函数时,第二第三个参数
类型为LPCTSTR,那么我们到底将它当做 LPCSTR还是LPCWSTR呢,这要看是否定义了unicode。如果没有的话那么我们传参
是直接传char*就可以,反之我们就要将char*转换为wchar_t*,我们可以通过L和_T来实现如下:
eg:
L("hello")或者_T("hello")都可以实现当然要注意微软推荐使用相匹配的字符串函数。
例如,在处理LPTSTR或LPCTSTR的时候,应该使用_tcslen()函数,这里_t和上面意思一样,科代表不同的字符
串长度的计算,我理解他因该是一系列函数,这要取决于你到底要计算的是ASNI还是unicode编码下的字符串长度,在这里用wcslen())来替代strlen函数。
否则,在Unicode编码方式下,strlen不能处理wchar_t*的字符串。会出现乱码。
另外:可以通过MultiByteToWideChar和WideCharToMultiByte来实现。

typedef unsigned char CHAR;
typedef unsigned wchar_t WCHAR; 以后遇到要注意。


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值