iconv Linux下编码转换

本文介绍如何在Linux环境下使用iconv库函数实现不同字符集之间的编码转换,并通过一个示例代码演示了从UTF-8到GBK的转换过程及注意事项。

iconv Linux下编码转换

知识标签:linux, iconv, 编码


有时程序运行时会用到编码转换,这时就用到iconv的3个函数
特写了一个测试小代码以作备忘

iconv3个函数原型

       iconv_t iconv_open(const char *tocode, const char *fromcode);
       size_t iconv(iconv_t cd,
                    char **inbuf, size_t *inbytesleft,
                    char **outbuf, size_t *outbytesleft);
       int iconv_close(iconv_t cd);

code

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<iconv.h>

void convert(char* left, size_t sizeleft, char* right, size_t sizeright)
{
    printf("left: %s\n", left);
    printf("rightleft: %ld\n", sizeleft);
    printf("right: %s\n", right);
    printf("sizeright: %ld\n", sizeright);
    printf("--------------------------\n");

    iconv_t cd = iconv_open("gbk", "utf-8");
    if((iconv_t)-1 == cd)
    {
        std::cout << "cd error !" << std::endl;
        return;
    }

    iconv(cd, (char**)&left, (size_t*)&sizeleft, (char**)&right, (size_t*)&sizeright);

    printf("left: %s\n", left);
    printf("rightleft: %ld\n", sizeleft);
    printf("right: %s\n", right);
    printf("sizeright: %ld\n", sizeright);

    iconv_close(cd);
}
int main(void)
{
    char buf[1024];
    size_t size_buf = sizeof(buf);
    //字符串一定要初始化为0,养成习惯,否则总是出现莫名错误
    memset(buf, 0, size_buf);
    strcpy(buf, "星期二我是中国人hello");
    size_t len_buf = strlen(buf);

    char buf2[1024];
    size_t size_buf2 = sizeof(buf2);
    memset(buf2, 0, size_buf2);

    //第二参数应该是缓存区的大小,不应该是缓存区中字符长度
    //应该是size_buf,不应该是len_buf
    convert(buf, size_buf, buf2, size_buf2);

    return 0;
}

结果

终端编码设置为utf-8的结果:
这里写图片描述

终端编码设置为gbk的结果:
这里写图片描述

总结

  • buf一定要memset(buf, 0, sizeof(buf))
  • size_buf一定要是缓存区的大小,不应该是缓存区中字符长度
  • 三步:1.iconv_open获取描述符 2.iconv转码 3.iconv_close关闭描述符
  • iconv转码后转码的结果保存在buf里面,而不是buf2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值