现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

Unicode下的CString 到 MBCS下的char * 之间的相互转换

2013-02-15 06:38 工业·编程 ⁄ 共 1331字 ⁄ 字号 暂无评论

字符集间的转换想必大家都有过比较痛苦的经历。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';   //缺少此句必然乱码

给我留言

留言无头像?