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);


     

  • 相关阅读:
    在做nginx的服务器http错误和解决办法
    利用ffmpeg将MP4文件切成ts和m3u8
    整理:服务器命令(笔记)
    函数式编程
    Object
    promise
    前端模块化、工程化
    函数
    restful && rpc
    全局、局部变量
  • 原文地址:https://www.cnblogs.com/1024incn/p/3924528.html
Copyright © 2011-2022 走看看