转载:http://blog.csdn.net/flydream0/article/details/8543525
VS编译环境下字符集分为使用Unicode字符集(UCS)和使用多字节字符集(MBCS)。
1.多字节字符模式
1.1 CString ->char *
CString str1 ="123";
char *t1 =str1.GetBuffer(str1.GetLength());
str1.ReleaseBuffer();
//do something with t1
1.2 char * -->CString
char *str ="aaaa";
CString str1(str);
1.3 CString -->int
CString str1 ="123";
int i =atoi(str1);
//do something with i
1.4 int -->CString
int i =100;
CString str;
str.Format("%d",i);
//...
2.Unicode编码模式
2.1 CString -->char *
2.2 char * -->CString
char *p ="test";
CString str(p);
//...
2.3 CString -->int
在这种情况下atoi不再适用,其实可以用swscanf,如下:
CString str2 =_T("100");
int i;
swscanf(str2,_T("%d"),&i);
2.4 int -->CString
int i =100;
CString str;
str.Format("%d",i);
//...
2.5 wstring ->string
string WideCharToMultiChar(wstring str)
{
string return_value;
//获取缓冲区的大小,并申请空间,缓冲区大小是按字节计算的
int len = WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), NULL, 0, NULL, NULL);
char *buffer = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), buffer, len, NULL, NULL);
buffer[len] = '\0';
//删除缓冲区并返回值
return_value.append(buffer);
delete[]buffer;
return return_value;
}
2.6 string->wstring
wstring MultCharToWideChar(string str)
{
//获取缓冲区的大小,并申请空间,缓冲区大小是按字符计算的
int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
TCHAR *buffer = new TCHAR[len + 1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
buffer[len] = '\0';//添加字符串结尾
//删除缓冲区并返回值
wstring return_value;
return_value.append(buffer);
delete[]buffer;
return return_value;
}
2.7 CString->string
CString str;
string mstring = WideCharToMultiChar(str.GetBuffer());
str.ReleaseBuffer();
2.8 CString->LPCWSTR
CString str=_T("TestStr");
USES_CONVERSION;
LPCWSTR lpcwStr = A2CW((LPCSTR)str);
2.9 LPCWSTR->CString
LPCWSTR lpcwStr = L"TestWStr";
CString str(lpcwStr);
3.其它转换
3.1. string转const char*
string s ="abc";
const char* c_s = s.c_str();
3.2 char* 或const char* 转string
const char* c_s ="abc";
string s(c_s);
char* c ="abc";
string s(c);
3.3 string转char*
string s ="abc";
char* c;
constint len = s.length();
c =newchar[len+1];
strcpy(c,s.c_str());
3.4 CString->LPTSTR
CString strFileName;
LPTSTR lpStr = strFileName.GetBuffer();
strFileName.ReleaseBuffer();
GetBuffer返回的LPTSTR为非const的,从而允许直接修改CString中的内容
4.数据类型
Windows定义的数据类型:
通用数据类型 | Unicode类型 | ANSI类型 | 说明 |
TCHAR | WCHAR (wchar_t) | CHAR (char) | 字符 |
LPTSTR | LPWSTR (wchar_t *) | LPSTR(char *) | 指向一个字符数组的指针 |
LPCTSTR | LPCWSTR (const wchar_t *) | LPCSTR(const char *) | 指向一个字符串常量的指针 |
在调用宏进行转换的函数开头,要加上一句代码
USES_CONVERSION;
相互转换方法:
LPWSTR->LPTSTR: W2T();
LPTSTR->LPWSTR: T2W();
LPCWSTR->LPCSTR: W2CT();
LPCSTR->LPCWSTR: T2CW();
ANSI->UNICODE: A2W();
UNICODE->ANSI: W2A();
A2CW表示(LPCSTR) -> (LPCWSTR)
注意:使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
1、只适合于进行短字符串的转换;
2、不要试图在一个次数比较多的循环体内进行转换;
3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();