本文涉及 : char跟CString转换、string跟char转换、string 跟CString转换 还有BSTR转换成char*、char*转换成BSTR、CString转换成BSTR、BSTR转换成CString的
我们经常写程序比如文件路径需要用到一般都是char*类型的变量作为参数传递,有些函数参数却是string或者CString,造成了经常需要转换,在这里我总结了一下:
char跟CString转换:
//CString char wchar_t 转换
//CString 转char
//方法一
CString cstr(_T("Hello Charm~!"));
wchar_t* wchar = cstr.GetBuffer();
char* c1 = new char[cstr.GetLength()+1]; cstr.ReleaseBuffer();
wcstombs(c1,wchar,cstr.GetLength()+1);
std::cout<<c1<<std::endl;
delete c1;
//方法二
CString theString( "Hello CHarm" );
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];
_tcscpy(lpsz, theString);
char* c2 = new char[theString.GetLength()+1];//必须动态分配足够的空间
wcstombs(c2,lpsz,theString.GetLength()+1);
std::cout<<c2<<std::endl;
delete c2;
//char wchar_t转 CString
char* p2 = "Hello CHarm";
wchar_t *p1 = new wchar_t[15];
mbstowcs(p1,p2,15);
std::wcout<<p1<<std::endl;
CString cstr1;
cstr1.Format(_T("%s"),p1);
::MessageBox(NULL,cstr1,NULL,0);
delete p1;
注意:
CString 是微软提供的数据类型,其中GetBuffer()函数是重载了ANSIC跟UNICODE的,假如编译器设置开启了Unicode
那它返回的就是宽字符类型,所以就需要wcstombs函数来转换。比如VC6下默认不支持Unicode,所以用它返回就不需要转换
string跟char转换:
//string char 互换
//string 转 char
string s1("Hello Charm");
char* c3 = new char[s1.size()+1];
strcpy(c3,s1.c_str()); //需要宽字节类型的 再用mbstowcs就可以了
std::cout<<c3<<std::endl;
delete c3;
//char 转string
char* c4 = "Hello CHarm";
string s2(c4);
std::cout<<s2<<std::endl;
注意:
string是标准库的数据类型,其成员函数c_str()返回的是ANSIC数据类型,所以不需要转换直接就为char,假如需要宽字符,再用mbstowcs就可以了
string 跟CString转换:
//CString string转换
//string 转CString
CString cstr2;
string s3 = "Hello CHarm";
char* c5 = new char[s3.size()+1];
wchar_t* c6 = new wchar_t[s3.size()+1];
strcpy(c5,s3.c_str());
mbstowcs(c6,c5,s3.size()+1);
cstr2.Format(_T("%s"),c6); //宽字符环境下CString需要宽字符
::MessageBox(NULL,cstr2,NULL,0);
delete c5;
delete c6;
//CString 转string
CString cs1("Hello Charm");
char* c7 = new char[cs1.GetLength()+1];
wcstombs(c7,cs1.GetBuffer(),cs1.GetLength()+1);
string s(c7);
std::cout<<s<<std::endl;
delete c7;
注意:
由上面两个就可以清楚知道:CString会根据环境重载ANSIC还是UNICODE版本的,而string只能是ANSIC版本的
而string跟CString转换原理是通过都转换为传统的char类型,然后再转换到对方,因此这里有需要进行ANSIC跟UICODE的转换
比如string接受传统的string s(char* ); 但CString.GetBuffer()返回有可能是wchar_t*类型的
BSTR转换成char*、char*转换成BSTR、CString转换成BSTR、BSTR转换成CString
(BSTR是COM里面经常会用到的数据类型,可能大家用得较少,我也没逐一进行认真分析了)
BSTR与char*转换:
//.BSTR与char*转换
//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;
//char*转换成BSTR
//方法一,使用SysAllocString等API函数。例如:
BSTR bstrText = ::SysAllocString(L"Test");
BSTR bstrText = ::SysAllocStringLen(L"Test",4);
BSTR bstrText = ::SysAllocStringByteLen("Test",4);
//方法二,使用COleVariant或_variant_t。例如:
_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);
CString与BSTR转换:
//CString转换成BSTR
//使用CStringT::AllocSysString来实现。例如:
CString str("This is a test");
BSTR bstrText = str.AllocSysString();
…
SysFreeString(bstrText); // 用完释放
//BSTR转换成CString
//一般可按下列方法进行:
BSTR bstrText = ::SysAllocString(L"Test");
CStringA str;
str.Empty();
str = bstrText; 或
CStringA str(bstrText);
/*转载请注明出处:www.gbcdbj..com---charm*/