现在的位置: 首页 > 综合 > 正文

UNICODE环境下将宽字符CString转换为char*

2018年04月06日 ⁄ 综合 ⁄ 共 2007字 ⁄ 字号 评论关闭

最近用VS编程,遇到点烦心事。VS默认是UNICODE环境,而我的函数接受的又是char *参数,不得已,上网搜索了一个貌似正常的结果,就用了。
该转换方式如下:

  1. (char*)strText.GetBuffer(strText.GetLength())  


初时不以为转换有错,结果运行之后,得不到想要的结果,那个满头大汗啊,把函数是翻过去又覆过来的重写了两遍,依然出错。
末了尝试将(char*)strText.GetBuffer(strText.GetLength())输出到文件,才发现,它仅仅是指向第一个字符。如”hello world!”,则只返回h
遂继续搜索,终得三种有效方法,可以将宽字符CString转换为char*。记录如下:
 
1.wcsXXX函数系列中的wcstombs

  1. CString strText=_T("Very Good");  
  2. char szTemp[100]={0};  
  3. wcstombs(szTemp, strText, strText.GetLength());  

 
2.AFXCONV.H中的W2A宏.使用前先#include

  1. CString strText=_T("How Much");  
  2. USES_CONVERSION;  //先调用此宏定义W2A需要使用到的变量  
  3.   
  4. char szTemp[100]=W2A(strText); //调用W2A宏  
  5.   
  6. /*** 
  7. #define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)  
  8. //定义了_convert _acp _lpw _lpa 三个变量  
  9. #define W2A(lpw) (\  
  10.     ((_lpw = lpw) == NULL) ? NULL : (\  
  11.         (_convert = (lstrlenW(_lpw)+1), \  
  12.         (_convert>INT_MAX/2) ? NULL : \  
  13.         ATLW2AHELPER((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw, _convert*sizeof(WCHAR), _acp))))  
  14. //另有W2A(lpa) W2A(lpa,cp) W2A(lpw,cp)三个宏匹配  
  15. ***/  


3.使用WideCharToMultiByte转换函数.函数原型是: 

  1. int WideCharToMultiByte(  
  2.   UINT CodePage,  
  3.   DWORD dwFlags,  
  4.   LPCWSTR lpWideCharStr,  
  5.   int cchWideChar,  
  6.   LPSTR lpMultiByteStr,  
  7.   int cbMultiByte,  
  8.   LPCSTR lpDefaultChar,  
  9.   LPBOOL lpUsedDefaultChar  
  10. );  


第一个参数CodePage指的是执行编码转换的代码页,一般使用ANSI标准代码页,参数为:CP_ACP
第二个参数,如无特殊处理要求,传入NULL即可
第三个参数,即为源参数,传入需要转换的宽字符WChar
第四个参数,即宽字符的长度,如果设为-1,将会自动计算长度
第五个参数,即多字节(char*)
第六个参数,即char*的可保存字符个数。第七个参数是设置默认填充字符和是否设置了填充字符
 
返回值:若函数运行成功,且cchMultiByte!=0,则返回成功转换的字节数;若函数运行成功,但cchMultiByte==0,则返回需要多少字节才能成功转换传入的lpWideCharStr;若运行失败,则返回0

  1. CString strText=_T("Wide Char Now");  
  2. char szTemp[100]={0};  
  3. int nConvert=WideCharToMultiByte(AP_ACP,NULL,strText,-1,szTemp,sizeof(szTemp),NULL,NULL);  
  4. if(nConvert==strText.GetLength()+1){   //转换个数应为字符数+1个结束符,才算转换成功  
  5.    MessageBox(_T("Convert Success");  
  6. }  

抱歉!评论已关闭.