GBK UTF8 编码转换

在编程过程中,经常遇到GBK、UTF8、Unicode等编码格式的字符串转换,现总结如下。


Windows平台下通过MultiByteToWideChar和WideCharToMultiByte两个函数来实现


其原理是先用“MultiByteToWideChar”函数把字符串转成unicode字符串,然后再用“WideCharToMultiByte”由unicode转成所需目的编码的字符串。


void ConvertGBKToUtf8(CString& strGBK)

{

    int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);

    unsigned short * wszUtf8 = new unsigned short[len+1];

    memset(wszUtf8, 0, len * 2 + 2);

    MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

    

    len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); 

    char *szUtf8=new char[len + 1];

    memset(szUtf8, 0, len + 1);

    WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

    

    strGBK = szUtf8;

    delete[] szUtf8;

    delete[] wszUtf8;

}


void ConvertUtf8ToGBK(CString& strUtf8)

{

    int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);

    unsigned short * wszGBK = new unsigned short[len+1];

    memset(wszGBK, 0, len * 2 + 2);

    MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

    

    len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL); 

    char *szGBK=new char[len + 1];

    memset(szGBK, 0, len + 1);

    WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

    

    strUtf8 = szGBK;

    delete[] szGBK;

    delete[] wszGBK;

}


Linux平台下通过iconv函数簇来实现


其中

iconv函数族的头文件是iconv.h,使用前需包含之。
#include <iconv.h>
iconv函数族有三个函数,原型如下:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。

(3) int iconv_close(iconv_t cd);
此函数用于关闭转换句柄,释放资源。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值