iconv Linux下编码转换

来源:互联网 发布:卡戴珊跟希尔顿比知乎 编辑:程序博客网 时间:2024/05/13 11:23

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
0 0