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

来源:互联网 发布:南瓜猫lolita淘宝店名 编辑:程序博客网 时间:2024/06/07 07:38

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

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


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

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



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

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


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

int WideCharToMultiByte(  UINT CodePage,  DWORD dwFlags,  LPCWSTR lpWideCharStr,  int cchWideChar,  LPSTR lpMultiByteStr,  int cbMultiByte,  LPCSTR lpDefaultChar,  LPBOOL lpUsedDefaultChar);


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

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