一、CString 转化成char[]
方法一:运用 CString.GetBuffer(0) 与 strcpy
CString str;
int len = str.GetLength();
char* arr = new char[len];
strcpy(arr,str.GetBuffer(0));
方法二:
char *转为CString可以直接赋值,比如MFC的CString转为char *
CString str = "abc"
char *psz = (LPTSTR)(LPCTSTR)str;
str = psz;
二、char[]转化成CString
char ch[7] = {'w','u','d','i','z','h','u'};
CString szTest(ch);
AfxMessageBox(szTest);
char ch[7] = {'w','u','d','i','z','h','u'};
CString szTest;
szTest.Format("%s",ch);
AfxMessageBox(szTest);
可是运行结果都是结尾有乱码。
在CString的最后多出了乱码,而测试得到的CString对象的长度为7,这是为什么呢?
CString 对象将ch 当做字符串来处理的,所以在把一个char[]转化成CString对象时,会分两个过程:首先会把char[]转化成char*,这个转化就会在字符串的结尾产生乱码,测试如下:
[cpp] view plaincopy
char ch[2] = {'a','b'};
TRACE("%s",ch);
调试运行得到:ab烫t
接着把char*字符串存储在CString对象的CStringData 对象中,这是保存的已经是存在乱码的数据了,所以在输出时就出现了我们看到的乱码,到这里或许大家都知道了乱码的原因了吧。
下面就着手解决,只要将数组的最后一位赋值为’/0’即可。
[cpp]
char ch[3] = {'a','b','\0'};
CString str;
str.Format("%s",ch);
AfxMessageBox(str);
或者
int size=strlen(char);
char[size-1] = '\0'
三、TCHAR转std::string
std::string TCHAR2STRING(TCHAR* sValue)
{
int iLen = WideCharToMultiByte(CP_ACP, 0, sValue, -1, NULL, 0, NULL, NULL);
char* chRv = new char[iLen * sizeof(char)];
WideCharToMultiByte(CP_ACP, 0, sValue, -1, chRv , iLen, NULL, NULL);
std::string strValue(chRv );
return strValue;
}