两种UNICODE字符集和MBCS字符集之间的转换方法

来源:互联网 发布:淘宝买个钻石店铺 编辑:程序博客网 时间:2024/06/01 20:23

          写之前声明一下, 此篇日志参考与《把脉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,再次调用函数即可。

            提示:将参数cbMultiByte置为0,预先调用一次WideCharToMultiByte(),即可获取到目标字符串的大小,类似于这样的预先"喽一眼"输出缓冲区大小的操作,其实在Windows API中还是很常见的。通常我们将某个参数或者结构参数的成员置为NULL或者0,调用相同的API函数,即可达到"喽一眼"的效果,然后根据获取到的大小值来分配合适的内存。

            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;  } 
输出结果如图所示: