字符集间的转换想必大家都有过比较痛苦的经历。VC6中的字符串使用的是多字节字符集(MBCS),简单地说,就是汉字字符每个占两个字节,英文字符每个占一个字节;而到了VC2005及以上的版本,都统一为宽字符集了(Unicode),简单地说,就是每个字符--不管是汉字字符还是英文字符--都占两个字节。由于很多的开源项目、库等,用的都是老式的多字节字符集,比如说套接字编程等等,这样的话,要在新的编程环境(VC2005以上)中使用含多字节字符集的源文件、函数等,就需要注意到这个问题。以下是一些好用的解决该问题的方法(实验环境VC2008):
方法一 :
char * 转 CString
利用A2T或A2W函数。
例如:
char * p= "这是char*字符串" ;
USES_CONVERSION ;
CString strW = A2T (p);
//或 CString strW = A2W (p);
CString 转 char *
利用T2A或W2A函数。
例如:
//接上例
char * pA =T2A(strW);
//或者char * pA =T2W(strW);
方法二:
通过CStringA 和 CString 的构造函数,也能实现char* 和 CString的转换
char * 转 CString
例如:
char * p= "这是char*字符串" ;
CStringA strA(p);
CString strW(strA);
CString转char *
CString strW=_T("这是TCHAR字符串");
CStringA strA(strW);
char *p = strA.GetBuffer();
-----------------------以下是一些测试数据---------------------
//VC2008-默认使用UNICODE
int szA = sizeof(char);//szA值为1(字节)
int szW = sizeof(TCHAR);//szW值为2(字节)
//多字节字符集版(MBCS)--VC6使用
char *p= "这是char的字符串";
//--sizeof(p)是4,它得到的不是字符串长度,而是char *指针的长度(字节)
//在定义了UNICODE后是Unicode版
TCHAR *tp = _T("这是unicode字符串");
CStringA strA(p);
int nL = strA.GetLength (); //nL值为16:汉字字符每个两个字节,英文字符每个字符一个字节
CString strW(tp);
int nLW = strW.GetLength (); //nLW值为12:它表明在strW中有12个字符。注意此GetLength()与上面的区别
char *pA = new char[nL+1];
TCHAR *pT = new TCHAR[nLW+1];
szA = sizeof(pA); //szA值为4
szW = sizeof(pT); //szW值为4
::memcpy (pA,strA.GetBuffer (),nL);
pA[nL]='\0'; //缺少此句必然乱码
::wmemcpy (pT,strW.GetBuffer (),nLW);
pT[nLW]='\0'; //缺少此句必然乱码