gb2312转utf-8

上网找了些资料,发现确实挺简单的,不知道为啥被人误导,弄出一个还被广泛转载的CChineseCode类。然而它仅仅针对汉字(每个汉字在UTF-8编码中占3个字节),如果字符串中有英文,就有麻烦了,因为英文在UTF-8编码中只有一个字节。另外有的字符会占用更多的字节。所以这个类并不适用。经过自己的亲自测试,真的是很多问题。再参考一些文章,给出转换方式如下:

//gb2312 to unicode
int wLen = MultiByteToWideChar(CP_ACP, 0, lpszText, -1, NULL, 0);
LPWSTR wStr = new WCHAR[wLen];
MultiByteToWideChar(CP_ACP, 0, lpszText, -1, wStr, wLen);
//unicode to utf8
int aLen = WideCharToMultiByte(CP_UTF8, 0, wStr, -1, NULL, 0, NULL, NULL);
char* converted = new char[aLen];
WideCharToMultiByte(CP_UTF8, 0, wStr, -1, converted, aLen, NULL, NULL);
//utf8 to unicode
int wLen2 = MultiByteToWideChar(CP_UTF8, 0, converted, -1, NULL, 0);
LPWSTR wStr2 = new WCHAR[wLen2];
MultiByteToWideChar(CP_UTF8, 0, converted, -1, wStr2, wLen2);
//unicode to gb2312
int aLen2 = WideCharToMultiByte(CP_ACP, 0, wStr2, -1, NULL, 0, NULL, NULL);
char* converted2 = new char[aLen2];
WideCharToMultiByte(CP_ACP, 0, wStr, -1, converted2, aLen2, NULL, NULL);

代码里面还缺少内存的释放,这个就不补上了。自己在vc6测试过,没什么问题。

 

再引用对《UTF-8与GB2312之间的互换》一文(即提出那个CChineseCode类,作者:吴康彬)的一个经典评论:

搞笑,这种害人害己的文章还有这么多人访问。
作者光知道 WideCharToMultiByte 可以把 Unicode 转成 GB2312 就不知道也可以把 Unicode 转换为 UTF-8 吗?
其实这是一个很简单的程序,都被作者搞复杂了。
要实现 GB2312 (其实是GBK)转换为 UTF-8 其实很简单,先用 MultiByteToWideChar 把 GB2312 转换为 Unicode,再用 WideCharToMultiByte 把 Unicode 转换为 UTF-8 就可以了。

UTF-8 转换为 GB2312 是个相反的过程,先用 MultiByteToWideChar 把 UTF-8 转换为 Unicode,再用 WideCharToMultiByte 把 Unicode 转换为 GB2312 就可以了。 ( 雁过留声 发表于 2007-1-11 9:11:00)

来源地址:http://blog.sina.com.cn/s/blog_706faf240100lgx4.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值