关于C++的字符转换的踩坑之旅(持续更新,上次更新2021/3/26)


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);

// 方法二:
CString cs("Hello");
std::string s((LPCTSTR)cs);

// 方法三: 最顽强的转换
CString cs ("Hello");
// Convert a TCHAR string to a LPCSTR
CT2CA pszConvertedAnsiString (cs);
// construct a std::string using the LPCSTR input
std::string strStd (pszConvertedAnsiString);

问题5:string转CString


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

问题5:CString转int


CString temp("8");

int i = _ttoi(temp); 

问题6:CString转char*

1.传给未分配内存的const char* (LPCTSTR)指针.
   CString cstr(asdd);
   const char* ch = (LPCTSTR)cstr;
   ch指向的地址和cstr相同。但由于使用const保证ch不会修改,所以安全.
2.传给未分配内存的指针.
    CString cstr = "ASDDSD";
    char *ch = cstr.GetBuffer(cstr.GetLength() + 1);
    cstr.ReleaseBuffer();
    //修改ch指向的值等于修改cstr里面的值.
    //PS:用完ch后,不用delete ch,因为这样会破坏cstr内部空间,容易造成程序崩溃.
3.第二种用法。把CString 值赋给已分配内存的char *。
    CString cstr1 = "ASDDSD";
    int strLength = cstr1.GetLength() + 1;
    char *pValue = new char[strLength];
    strncpy(pValue, cstr1, strLength);
4.第三种用法.把CString 值赋给已分配内存char[]数组.
    CString cstr2 = "ASDDSD";
    int strLength2 = cstr2.GetLength() + 1;
    char chArray[100];
    memset(chArray,0, sizeof(bool) * 100); //将数组的垃圾内容清空.
   strncpy(chArray, cstr2, strLength2);

CString 转char*的原始链接

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值