多字节转化为宽字节

来源:互联网 发布:mastercam9.13d编程 编辑:程序博客网 时间:2024/05/16 01:19

资料转载自:

http://hi.baidu.com/%C7%D8%B7%E7%CF%FE%D4%C2%C3%F7/blog/item/889a927fa3e2a7f52e73b393.html

http://blog.csdn.net/cynthiamoonbeen/article/details/5818564

http://blog.csdn.net/xieqq8/article/details/5189970


字符集间的转换想必大家都有过比较痛苦的经历。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);

 

CStringchar *

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';   //缺少此句必然乱码


原创粉丝点击