C语言-字符编码转换:UTF-8与GB18030

10 篇文章 0 订阅
头文件

#include <iconv.h>
#include <errno.h>

利用iconv函数族进行编码转换 
iconv函数族的头文件是iconv.h,使用前需包含之。 

#include <iconv.h> 

在使用iconv转码的时候,首先用iconv_open获取转码句柄,然后调用iconv转码,转完了后调用iconv_close关闭句柄。

iconv函数中:

参数cd是用iconv_open调用返回的转码句柄;
参数inbuf指向需要转码的缓冲区;
参数inbytesleft是inbuf所保存的需要转码的字节数;
参数outbuf存放转码结果;
参数outbytesleft存放outbuf空间的大小。

如果调用成功,iconv返回转换的字节数(不可逆转调用的字节数,可逆转调用的字节数不包括在内)。否则返回-1,并设置相应的errno。

iconv逐步扫描inbuf,每转换一个字符,就增加inbuf,减少inbytesleft,并将结果存入outbuf,结果字节数存入outbytesleft。遇到下列情况将停止扫描并返回:

1. 多字节序列无效,这时候errno为EILSEQ,*inbuf指向第一个无效的字符;

2. 有字节留在inbuf尚未转换,errno为EINVAL;

3. outbuf空间不够,errno为E2BIG;

4. 正常转换完备。

对于iconv函数,还有两种调用情况:

1.

inbuf或者*inbuf为NULL,outbuf和*outbuf不为NULL,iconv会设置转换状态为初始状态,并保存转换序列到*outbuf。如果outbuf空间不足,errno会设置为E2BIG,返回(size_t)(-1);

2. inbuf或者*inbuf为NULL,outbuf或者*outbuf也为NULL,iconv设置转换状态为初始状态。

void utf8_to_gb18030(char* inbuf,char* outbuf,size_t outLen);


void utf8_to_gb18030(char* inbuf,char* outbuf,size_t outLen)
{
    char* pinbuf =inbuf;
    size_t inLen =strlen(inbuf)+1;
    iconv_t ct = iconv_open("gb18030","utf-8");
    if(ct == (iconv_t)-1)
    {
        printf("\033[1;31miconv_open error!!!\n\033[0m");
        return;
    }
    memset(outbuf,0,outLen);
    size_t ret =iconv(ct,&pinbuf,(size_t*)&inLen,&outbuf,(size_t*)&outLen);
    if(ret == (size_t)-1)
    {
        switch(errno)
        {
        case E2BIG:
            printf("\033[1;31merrno:E2BIG(outbuf空间不够)\n\033[0m");
            break;
        case EILSEQ:
            printf("\033[1;31merrno:EILSEQ(inbuf多字节序无效)\n\033[0m");
            break;
        case EINVAL:
            printf("\033[1;31merrno:EINVAL(有残余的字节未转换)\n\033[0m");
            break;
        default:
            break;
        }
    }
    iconv_close(ct);

}

使用

char convstr[128];//尽量设置大一点,不容易出错

char str[]="测试一下编码转换";

utf8_to_gb18030(str,convstr,sizeof(convstr));

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值