您的位置:首页 > 其它

用MultiCharToWideChar、WideCharToMultiChar进行编码转换

2009-04-04 13:21 661 查看
最近应为工作原因,需要在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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: