您的位置:

CString转String详解

一、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

    #include 
    CString 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转换的开发者。