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; 以后遇到要注意。
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; 以后遇到要注意。