关于C++的字符转换的踩坑之旅(持续更新,上次更新2020/8/19)

C++字符转换

  • 使用UNICODE字符集
    • 问题1: string 转 LPCTSTR
    • 问题2:_variant_t转string
    • 问题3:string转_variant_t
    • 问题4:CString转string
    • 问题5:string转CString
  • 不使用UNICODE字符集(也叫多字符集)

C++的字符转换在使用不同的字符集的时候是不同的,这是因为C++在定义宏的过程中产生的问题

使用UNICODE字符集

问题1: string 转 LPCTSTR

实际定位到真正的类型其实是 string 转 WCHAR
而string 中有个函数,.c_str() 可以将string 转成char *
实际的过程如下面程序

string all = "123";
WCHAR WCHAR_STR_all[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP, 0, all.c_str(), strlen(all.c_str()), WCHAR_STR_all, sizeof(WCHAR_STR_all));
WCHAR_STR_all[lLen] = L'\0';
int iLen = WideCharToMultiByte(CP_ACP, 0, WCHAR_STR_all, -1, NULL, 0, NULL, NULL);
MessageBox(WCHAR_STR_all);

问题2:_variant_t转string

class _variant_t : public ::tagVARIANT

_variant_t str;  //这里为了演示并没有赋值,实际使用时是有值的
string ans = (char*)(_bstr_t)str;

问题3:string转_variant_t

_variant_t temp;
string str;		//演示时没有赋初值,实际用时要有值
temp.SetString(str.data());

问题4:CString转string

CString cstring;
std::string str;
str = (LPCSTR)(CStringA)(cstring);

问题5:string转CString


string str;
CString cstring;
//方法一
cstring = str.c_str();
//方法二
cstring.Format(L"%s", str.c_str());

不使用UNICODE字符集(也叫多字符集)

你可能感兴趣的:(C++踩坑)