C++字符转换
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);