写之前声明一下, 此篇日志参考与《把脉VC++》。
两种方法如下:
1、利用Windows提供的转换函数WideCharToMultiByte()和MultiByteToWideChar()来完成,函数的原型如下:
int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar ); int MultiByteToWideChar( UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar );望文生义,WideCharToMultiByte()用来将宽字符转换成MBCS,MultiByteToWideChar()用以将MBCS转换成宽字符。通常情况下,我们可能开始并不知道转换之后的字符串会占用多大的字节,这个时候我们可以将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte()和MultiByteToWideChar(),它们的返回值即为目标字符串的字节大小,然后再利用该大小作为参数cbMultiByte,再次调用函数即可。
2、用_bstr_t类来实现字符编码的转换。这种方法相当的管用,_bstr_t提供如下构造函数:
class _bstr_t { public: // Constructors // _bstr_t() throw(); _bstr_t(const _bstr_t& s) throw(); _bstr_t(const char* s) throw(_com_error); _bstr_t(const wchar_t* s) throw(_com_error); _bstr_t(const _variant_t& var) throw(_com_error); _bstr_t(BSTR bstr, bool fCopy) throw(_com_error); ...可以看出,_bstr_t同时支持char *和wchar_t *类型。_bstr_t提供了如下转换操作符函数:
// Assignment operators // _bstr_t& operator=(const _bstr_t& s) throw(); _bstr_t& operator=(const char* s) throw(_com_error); _bstr_t& operator=(const wchar_t* s) throw(_com_error); _bstr_t& operator=(const _variant_t& var) throw(_com_error);下面我们就动手做一做吧:
#include <iostream> #include <windows.h> #include <comdef.h> using namespace std; int main() { setlocale(LC_ALL, "chs"); //配置地域化信息 char s1[] = "AB汉字"; wchar_t s2[] = {0x41,0x42,0x6c49,0x0}; //"AB汉"或者是这样赋值:L"AB汉"; //1、使用xtoy转换 //s2-->p1 //第一次调用,计算MBCS字符串字节长度 int len1 = WideCharToMultiByte( CP_ACP, 0, s2, //宽字符串指针 sizeof(s2), //宽字符串长度 NULL, 0, //参数0表示计算转换后的字符空间 NULL, NULL); char * p1 = new char[len1]; WideCharToMultiByte( CP_ACP, 0, s2, //宽字符串指针 sizeof(s2), //宽字符串长度 p1, //转换后的字符串指针 len1, //给出空间大小 NULL, NULL); printf("%s\r\n", p1); delete [] p1; //s1-->p2 //第一次调用,计算宽字符串字节长度 int len2 = MultiByteToWideChar( CP_ACP, 0, s1, //MBCS字符串指针 sizeof(s1), //MBCS字符串长度 NULL, 0); wchar_t * p2 = new wchar_t[len2]; MultiByteToWideChar( CP_ACP, 0, s1, //MBCS字符串指针 sizeof(s1), //MBCS字符串长度 p2, //转换后的字符串指针 len2); printf("%S\r\n", p2); delete [] p2; //2、使用BSTR完成转换 _bstr_t bs1(s1); _bstr_t bs2(s2); char * bp1 = bs2; //convert printf("%s\r\n", bp1); wchar_t * bp2 = bs1; //convert printf("%S\r\n",bp2);//大写S return 0; }输出结果如图所示: