一、CString转String函数
CString是MFC(Microsoft Foundation Class)中提供的一种字符串类,而String是C++11标准中的字符串类。在两者之间进行转换是很常见的操作。可以使用CString::GetString
函数将CString对象转换为char*类型,然后再将char*类型转换为string类型。
CString cstr = "Hello World!"; std::string str(cstr.GetString()); std::cout << str << std::endl;
在使用GetString
函数时需要注意,如果CString对象被修改,那么返回的指针也会指向修改后的字符串,因此必须保证在使用指针之前CString对象不会被修改。
二、CString转char数组
使用ConvertUnicodeToMultiByte
函数将CString对象转换为char数组。
CString cstr = "Hello World!"; char s[100]; WideCharToMultiByte(CP_ACP, NULL, cstr, -1, s, 100, NULL, NULL); std::cout << s << std::endl;
其中WideCharToMultiByte
是Windows API中将Unicode编码的字符转换为多字节字符集的函数。
三、CString转String utf8
使用CT2CA
函数将CString对象转换为char*类型,然后再将char*类型转换为string类型,CT2CA
默认将CString转换为UTF-8字符串。
CString cstr = "Hello World!"; std::string utf8str(CT2CA(cstr)); std::cout << utf8str << std::endl;
四、CString转String出错
CString到string的转换可能会出现乱码,特别是在多字节字符集(如GBK)中常常出现这种情况。如果出现乱码,最好的解决办法是使用Unicode字符集。
如果一定要使用多字节字符集,可以先将CString转换为wchar_t数组,再将wchar_t数组转换为char数组,并指定正确的代码页。
CString cstr = "你好世界!"; wchar_t wsz[100]; wcscpy_s(wsz, cstr); char s[100]; WideCharToMultiByte(CP_ACP, NULL, wsz, -1, s, 100, NULL, NULL);//这里的-1 是因为WideCharToMultiByte函数在 NULL字符时能够自己计算长度 std::cout << s << std::endl;
五、CString转String^
CString到String^可以使用marshal_as
函数进行转换,需要包含头文件msclr/marshal_cppstd.h
。
#includeCString cstr = "Hello World!"; String^ str = msclr::interop::marshal_as<String^>(CString(cstr)); Console::WriteLine(str);
六、CString转char
将CString对象转换为char类型可以使用(LPCTSTR)
强制转换。
CString cstr = "H"; char c = (LPCTSTR)cstr; std::cout << c << std::endl;
七、CString转double
将CString对象转换为double类型可以使用_tstof
函数。
CString cstr = "3.1415926"; double pi = _tstof(cstr); std::cout << pi << std::endl;
八、CString转换为String
使用CT2T
函数将CString对象转换为CT2T<CString, strtype>
类型,然后再通过ToString
函数将其转换为String类型。
CString cstr = "Hello World!"; String^ str = gcnew String(CT2T<CString, strtype>(cstr).ToString()); Console::WriteLine(str);
九、CString转byte数组
使用wstring
类型临时转换,然后使用reinterpret_cast
强制转换为unsigned char*
类型的指针即可。
CString cstr = "Hello World!"; std::wstring wstr = CT2W(cstr); unsigned char* bytes = reinterpret_cast(wstr.c_str()); int len = wstr.size() * sizeof(wchar_t); for (int i = 0; i < len; ++i) { std::cout << (int)bytes[i] << " "; } std::cout << std::endl;
总之,CString到String的转换虽然看起来很简单,但是却需要注意很多细节。希望本文能够帮助到需要进行CString到String转换的开发者。