最近用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");
- }