zoukankan      html  css  js  c++  java
  • linux下使用libiconv库转码

    iconv命令实现linux下字符集编码的转换  

    windows下的文件复制到linux下时常会乱码,因为windows下文件编码为GBK,linux下默认文件编码为UTF-8,故需要libiconv库转码。

    1.iconv命令用法如下:

    iconv [选项...] [文件...]
     
    输入/输出格式规范:
    -f, --from-code=名称 原始文本编码
    -t, --to-code=名称 输出编码
     
    信息:
    -l, --list 列举所有已知的字符集
     
    输出控制:
    -c 从输出中忽略无效的字符
    -o, --output=FILE 输出文件
    -s, --silent 关闭警告
    --verbose 打印进度信息
     
    将GBK编码的文件Hosts_GBK转换为UTF-8编码的HOSTS_UTF8.
    示例如下:
    iconv -f GBK -t UTF-8 Hosts_GBK > HOSTS_UTF8
     

    2.iconv函数:

    (1) iconv_t iconv_open(const char *tocode, const char *fromcode);
    此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。

    详细说明:http://linux.die.net/man/3/iconv_open

    (2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
    此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。

    详细说明:http://pubs.opengroup.org/onlinepubs/009695399/functions/iconv.html

      大部分情形是inbuf 不为NULL,*inbuf也不为NULL。这种情况下,iconv函数将以*inbuf起始的多字节序列转换到以*outbuf起始的多字节序列。从*inbuf开始读取,最多*inbytesleft字节,转换后,从*outbuf开始写入,最多*outbytesleft字节。

      iconv函数一次转换一个多字节字符,每次字符转换,*inbuf增加已转换的字节数,*inbytesleft相应地减少已转换的字节数;对应地,*outbuf*outbytesleft作相应的修改,同时修改cd的转换状态,因此,相应的操作要针对其副本。

    以下四种情况不能完成转换:

    1.输入中含无效的多字节序列。此时,它将errno设置为EILSEQ并返回(size_t)(-1)。*inbuf指向无效序列的最左端。

    2.输入的字节序列已经全部被转换过,也就是*inbytesleft减少至0。此时,iconv返回本次调用中完成转换的数目(可逆的转换不计入)。

    3.输入中以不完整多字节序列作结尾。此时,它将errno设置为EINVAL并返回(size_t)(-1)。*inbuf指向不完整多字节序列的最左端。

    4.输出缓存区没有足够空间来存储下一个字符。此时,它将errno设置为E2BIG并返回(size_t)(-1)。

      另一种情形是inbuf 为NULL或*inbuf为NULL,但*outbuf 不为NULL,*outbuf也不为NULL。这种情况下,iconv函数试图将cd的转换状态设置为初始状态并store a corresponding shift sequence at *outbuf。从*outbuf开始,最多写入*outbytesleft字节。如果输出缓存区没有足够空间来存储这个重置后的序列,他将errno设置为E2BIG并返回(size_t)(-1)。反之,*outbuf增加写入的字节数和*outbytesleft减少写入的字节数。

      第三种情形是inbuf 为NULL或*inbuf为NULL,*outbuf 为NULL或*outbuf为NULL。这种情况下,iconv函数试图将cd的转换状态设置为初始状态。

    返回值:

    iconv函数返回本次调用中转换的字符数,可逆的转换不计入。出错时,它将修改errno并返回(size_t)(-1)。

    错误:

    E2BIG               *outbuf没有足够的空间。

    EILSEQ              输入含无效的多字节序列。

    EINVAL              输入含不完整多字节序列。

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

    c代码示例

    //将utf-8转为gb2312,代码仅供参考。
    iconv_t cd;
    char src_utf8[20]="utf8编码"; char *inbuf=src_utf8; int inen=strlen(inbuf); int outlen=255; char *outbuf=(char *)malloc(outlen); cd=iconv_open("gb2312","utf-8"); iconv(cd,&inbuf,(size_t *)&inlen,&outbuf,&outlen); printf("%s ",outbuf); iconv_close(cd); free(outbuf);


     

  • 相关阅读:
    centos7.6 使用yum安装mysql5.7
    解决hadoop本地库问题
    docker-compose 启动警告
    docker 安装zabbix5.0 界面乱码问题解决
    docker 部署zabbix问题
    zookeeper 超时问题
    hbase regionserver异常宕机
    (转载)hadoop 滚动升级
    hadoop Requested data length 86483783 is longer than maximum configured RPC length
    zkfc 异常退出问题,报错Received stat error from Zookeeper. code:CONNECTIONLOSS
  • 原文地址:https://www.cnblogs.com/1024incn/p/3924528.html
Copyright © 2011-2022 走看看