浅谈c++字符类型总结区别wchar_t,char,WCHAR
1、区别wchar_t,char,WCHAR
ANSI:即 char,可⽤字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。
UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在⾥:
typedef unsigned short wchar_t;
另外,在头⽂件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_t
wchar_t 可⽤字符串处理函数:wcscat(),wcscpy(),wcslen()等以wcs打头的函数。为了让编译器识别Unicode字符串,必须以在前⾯加⼀个“L”,例如: wchar_t *szTest=L"This is a Unicode string.";
2、TCHAR
在C语⾔⾥⾯提供了 _UNICODE宏(有下划线),在Windows⾥⾯提供了UNICODE宏(⽆下划线),只要定了_UNICODE 宏和UNICODE宏,系统就会⾃动切换到UNICODE版本,否则,系统按照ANSI的⽅式进⾏编译和运⾏。只定义了宏并不能实现⾃动的转换,他还需要⼀系列的字符定义⽀持。
1. TCHAR
如果定义了UNICODE宏则TCHAR被定义为wchar_t。
typedef wchar_t TCHAR;
否则TCHAR被定义为char typedef char TCHAR;
2. LPTSTR
如果定义了UNICODE宏则LPTSTR被定义为LPWSTR。
typedef LPTSTR LPWSTR;
否则TCHAR被定义为char typedef LPTSTR LPSTR;
说明:在使⽤字符串常量的时候需要使⽤_TEXT(“MyStr”)或者_T("")来⽀持系统的⾃动转换。
3、BSTR
BSTR是⼀个带长度前缀的字符串,主要由操作系统来管理的,所以要⽤api.主要⽤来和VB打交道的(VB⾥的string就是指它)要操作它的API函数有很多.⽐如SysAllocString,SysFreeString等等.
vc⾥封装它的类如_bstr_t,及ATL中的CComBSTR等.
⼀个 BSTR 由头部和字符串组成,头部包含了字符串的长度信息,字符串中可以包含嵌⼊的 null 值。
BSTR 是以指针的形式进⾏传递的。(指针是⼀个变量,包含另外⼀个变量的内存地址,⽽不是数据。) BSTR 是 Unicode
的,即每个字符需要两个字节。 BSTR 通常以两字节的 null 字符结束。 wstr是宽字符,以双字节表⽰⼀个字符 bstr是为了与原先的basic字符兼容,它的最前⾯的4个字节为其长度,以'\0'结束.
4、更进⼀步的字符串以及其指针的类型定义
由于Win32 API⽂档的函数列表使⽤函数的常⽤名字(例如, "SetWindowText"),所有的字符串都是⽤TCHAR来定义的。(除了XP中引⼊的只适⽤于Unicode的API)。下⾯列出⼀些常⽤的typedefs,你可以在msdn中看到他们。
type Meaning in MBCS builds Meaning in Unicode builds
WCHAR wchar_t wchar_t
LPSTR char*char*
LPCSTR const char*const char*
LPWSTR wchar_t*wchar_t*
LPCWSTR wchar_t*wchar_t*
TCHAR TCHAR char wchar_t
LPTSTR TCHAR*TCHAR*
LPCTSTR const TCHAR*const TCHAR*
5、相互转换
(1) char*转换成CString
若将char*转换成CString,除了直接赋值外,还可使⽤CString::Format进⾏。例如:
char chArray[] = "This is a test";
char * p = "This is a test";
或
LPSTR p = "This is a test";
或在已定义Unicode应的⽤程序中
TCHAR * p = _T("This is a test");
或
LPTSTR p = _T("This is a test");
CString theString = chArray;
theString.Format(_T("%s"), chArray);
theString = p;
(2) CString转换成char*
若将CString类转换成char*(LPSTR)类型,常常使⽤下列三种⽅法:
⽅法⼀,使⽤强制转换。
例如:
CString theString( "This is a test" );
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;
⽅法⼆,使⽤strcpy。
例如:
CString theString( "This is a test" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第⼆个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会⾃动对其进⾏转换。
⽅法三,使⽤CString::GetBuffer。
例如:
CString s(_T("This is a test "));
LPTSTR p = s.GetBuffer();
// 在这⾥添加使⽤p的代码
if(p != NULL) *p = _T('\0');
s.ReleaseBuffer();
// 使⽤完后及时释放,以便能使⽤其它的CString成员函数
(3) BSTR转换成char*
⽅法⼀,使⽤ConvertBSTRToString。
例如:
#include
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // ⽤完释放
delete[] lpszText2;
return 0;
}
⽅法⼆,使⽤_bstr_t的赋值运算符重载。
例如:
_bstr_t b = bstrText;
char* lpszText2 = b;
(4) char*转换成BSTR
⽅法⼀,使⽤SysAllocString等API函数。
例如:
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
⽅法⼆,使⽤COleVariant或_variant_t。
例如:
//COleVariant strVar("This is a test");
c++string类型_variant_t strVar("This is a test");
BSTR bstrText = strVar.bstrVal;
⽅法三,使⽤_bstr_t,这是⼀种最简单的⽅法。
例如:
BSTR bstrText = _bstr_t("This is a test");
⽅法四,使⽤CComBSTR。
例如:
BSTR bstrText = CComBSTR("This is a test");
或
CComBSTR bstr("This is a test");
BSTR bstrText = bstr.m_str;
⽅法五,使⽤ConvertStringToBSTR。
例如:
char* lpszText = "Test";
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);
(5) CString转换成BSTR
通常是通过使⽤CStringT::AllocSysString来实现。
例如:
CString str("This is a test");
BSTR bstrText = str.AllocSysString();
…
SysFreeString(bstrText); // ⽤完释放
(6) BSTR转换成CString
⼀般可按下列⽅法进⾏:
BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText;
或
CStringA str(bstrText);
(7) ANSI、Unicode和宽字符之间的转换
⽅法⼀,使⽤MultiByteToWideChar将ANSI字符转换成Unicode字符,使⽤WideCharToMultiByte将Unicode字符转换成ANSI 字符。
⽅法⼆,使⽤“_T”将ANSI转换成“⼀般”类型字符串,使⽤“L”将ANSI转换成Unicode,⽽在托管C++环境中还可使⽤S将ANSI 字符串转换成String*对象。例如:
TCHAR tstr[] = _T("this is a test");
wchar_t wszStr[] = L"This is a test";
String* str = S”This is a test”;
⽅法三,使⽤ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所⽰的统⼀形式:
其中,第⼀个C表⽰“类”,以便于ATL 3.0宏相区别,第⼆个C表⽰常量,2表⽰“to”,EX表⽰要开辟⼀定⼤⼩的缓冲。SourceType和DestinationType可以是A、 T、W和OLE,其含义分别是ANSI、Unicode、“⼀般”类型和OLE字符串。例
如,CA2CT就是将ANSI转换成⼀般类型的字符串常量。
下⾯是⼀些⽰例代码:
LPTSTR tstr= CA2TEX<16>("this is a test");
LPCTSTR tcstr= CA2CT("this is a test");
wchar_t wszStr[] = L"This is a test";
char* chstr = CW2A(wszStr);
以上这篇浅谈c++ 字符类型总结区别wchar_t,char,WCHAR就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论