用MultiCharToWideChar、WideCharToMultiChar进行编码转换

最近应为工作原因,需要在windows平台下,对utf8编码和gb2312下编码进行转换。

网上有很多示例,不过都不是很简洁,利用各种规则,代码很长,不易调试和修改。其实windows api中的MultiCharToWideChar、WideCharToMultiChar这两个函数就可以帮我们解决这个问题(注:这里是一种尝试,因为没有经过大量的测试,并不能保证没有bug)

 

一些基本信息在msdn上,不再详细说,请参考下面链接

MultiCharToWideChar  http://msdn.microsoft.com/en-us/library/bb202786.aspx

WideCharToMultiByte  http://msdn.microsoft.com/en-us/library/aa908730.aspx

Code Page Identifiers http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx

 

首先看utf8转成Gb2312

bool utf8ToGb2312(const string& utfstr, string& gbstr);

参数和返回值说明

utfstr,std::string类型,待转换的utf8字符串

gbstr,std::string类型,转换后得到的gb2312字符串

返回值,bool型,转换成功true,失败false;

 

 

第一步 utf8 to unicode

//首先获取目标(unicode)字符串长度
DWORD wsSize = MultiByteToWideChar(CP_UTF8, 0, utfstr.c_str(), utfstr.length(), NULL, 0);

 

//给目标字符串分配空间,MultiByteToWideChar得到的是一个non-terminate字符串

//多分配1的空间,补零变成C字符串形式,因为有些函数例如strcpy_s需要C字符串
wchar_t* pwUnicode= new wchar_t[wsSize + 1];

 

//转成Unicode
MultiByteToWideChar(CP_UTF8, 0, utfstr.c_str(), utfstr.length(), pwUnicode, wsSize);

 

//补0
pwUnicode[wsSize] = 0;

 

第二步 unicode to utf8(过程基本相同)

DWORD msSize = WideCharToMultiByte(936, 0, pwUtf, wsSize, NULL, 0, NULL, NULL);
char* psGb = new char[msSize + 1];
WideCharToMultiByte(936, 0, pwUtf, wsSize, psGb, msSize, NULL, NULL);
psGb[msSize] = 0;

 

完整的函数,以供参考(并未经大量测试,慎用)

bool urlParsing::utf8ToGb2312(const string& utfstr, string& gbstr)
{
     //to unicode
     DWORD wsSize = MultiByteToWideChar(CP_UTF8, 0, utfstr.c_str(), utfstr.length(), NULL, 0);
     wchar_t* pwUnicode= new wchar_t[wsSize + 1];
     if(MultiByteToWideChar(CP_UTF8, 0, utfstr.c_str(), utfstr.length(), pwUnicode, wsSize) == 0)
     {
          delete[] pwUnicode;
          return false;
     }
     pwUtf[wsSize] = 0;

    

     //to gb2312
     DWORD msSize = WideCharToMultiByte(936, 0, pwUtf, wsSize, NULL, 0, NULL, NULL);
     char* psGb = new char[msSize + 1];
     if(WideCharToMultiByte(936, 0, pwUtf, wsSize, psGb, msSize, NULL, NULL)==0)
    {
         delete[] pwUnicode;
         delete[] psGb;
         return false;
     }
     psGb[msSize] = 0;
 
     gbstr = psGb;

     delete[] pwUnicode;
     delete[] psGb;
    

     return true;
}

 

 

Gb2312 转成UTF8

我没有去实现,但我想应该和上面基本相同,也是先转成Unicode,再转成gb2312。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值