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

          写之前声明一下, 此篇日志参考与《把脉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;
  } 
输出结果如图所示:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值