用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。
网上有很多示例,不过都不是很简洁,利用各种规则,代码很长,不易调试和修改。其实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。
相关文章推荐
- UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换,中文乱码的解决方案
- UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换,中文乱码的解决方案
- 用MultiByteToWideChar和WideCharToMultiByte进行短字符和宽字符之间的转换
- UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换,中文乱码的解决方案
- UniCode 下CString 转 char*,利用WideCharToMultiByte进行转换
- 用MultiByteToWideChar和WideCharToMultiByte进行短字符和宽字符之间的转换
- [VBA]Excel输出utf-8编码格式文件 使用WideCharToMultiByte
- MultiByteToWideChar和WideCharToMultiByte用法详解
- WideCharToMultiByte和MultiByteToWideChar函数的用法
- WideCharToMultiByte和MultiByteToWideChar函数的用法
- Delphi数据类型转换(有几个字符串函数没见过,比如StringToWideChar和WideCharToString)
- MultiByteToWideChar和WideCharToMultiByte用法
- do-while(0)的妙用及MultiByteToWideChar和WideCharToMultiByte的用法
- WideCharToMultiByte和MultiByteToWideChar函数的用法
- MultiByteToWideChar和WideCharToMultiByte用法详解
- MultiByteToWideChar和WideCharToMultiByte用法详解
- MultiByteToWideChar和WideCharToMultiByte用法详解
- C++ WideCharToMultiByte函数注意事项
- linux没有WideCharToMultiByte,MultiByteToWideChar 相应的处理
- MultiByteToWideChar和WideCharToMultiByte用法详解