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

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

[cpp]  view plain copy
  1. (char*)strText.GetBuffer(strText.GetLength())  


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

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



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

[cpp]  view plain copy
  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转换函数.函数原型是: 

[cpp]  view plain copy
  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

[cpp]  view plain copy
  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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值