怎样学习使用libiconv库 - My Study

About My Learn or Study etc.

怎样学习使用libiconv库

By Cnangel on February 27, 2008 3:45 PM | 1 Comment
    libiconv库是一个基于GNU协议的开源库,主要是解决多语言编码处理转换等应用问题。
    怎样学习使用libiconv库?对于刚接触到人来说,这篇文章不妨去看一看,若已经用到过该库的人,在应用的过程中可能遇到一些问题,我们可以一起来探讨,我的联系方式是 cnangel@gmail.com

    几个函数原型:
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);

    其中:
iconv_open是打开一个编码流,类似于打开一个编码管道(通道),出错则返回 -1;
iconv用于具体输入的转换,如果出错,则返回 -1,否则返回 0;
iconv_close是关闭该管道(通道)。
    举个例子:

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

#define OUTLEN 255
int covert(char *, char *, char *, size_t , char *, size_t );

int main(int argc, char *argv[])
{
    char *input = "中国";
    size_t len = strlen(input);
    char *output = (char *)malloc(OUTLEN);
    covert("UTF-8", "GBK", input, len, output, OUTLEN);
    printf("%s\n", output);
    return 0;
}

int covert(char *desc, char *src, char *input, size_t ilen, char *output, size_t olen)
{
    char **pin = &input;
    char **pout = &output;
    iconv_t cd = iconv_open(desc, src);
    if (cd == (iconv_t)-1)
    {
        return -1;
    }
    memset(output, 0, olen);
    if (iconv(cd, pin, &ilen, pout, &olen)) return -1;
    iconv_close(cd);
    return 0;
}

    这里面covert函数就是用于将编码进行转换,其中要注意的地方是iconv函数的传递参数:
1,iconv传递有5个参数;
2,第3个参数和第5个参数一般是input和output实际分配的大小,一般是 sizeof(type)*strlen(string);
3,第4个参数是不能直接传递指针的地址,因为iconv函数能够改变指针的值,所以需要复制一份指针变量;
    如果对于大量需要转换的编码,上述函数covert不适合该方式,一是内存的限制不能一次调用,二是若分多次调用会频繁打开一个编码管道(通道),导致资源浪费,最好的办法还是拆开该函数根据情况使用。
    这里补充一下代码:
translateSP.h:

 #ifndef __TRANSLATESP_H_
 #define __TRANSLATESP_H_
 #include <iconv.h>
 
 class TranslateSP
 {
     public:
         TranslateSP():i_cd(0){}
         TranslateSP(const char *from_charset,const char *to_charset)
         {
             i_cd = iconv_open(to_charset, from_charset);
             if ((iconv_t)-1 == i_cd) printf("iconv open error!\n");
         }
         ~TranslateSP()
         {  
             if (i_cd)
                 iconv_close(i_cd);
         }
 
     public:
         size_t translate(char *src, size_t srcLen, char *desc, size_t descLen);
         size_t convert(const char *from_charset, const char *to_charset,
                 char *src, size_t srcLen, char *desc, size_t descLen);
 
     private:
         iconv_t i_cd;
 };
 
 #endif

translateSP.cpp:

 #include "translateSP.h"
 
 #define MAX_LEN 200
 
 size_t TranslateSP::translate(char *src, size_t srcLen, char *desc, size_t descLen)
 {
     char **inbuf = &src;
     char **outbuf = &desc;
     memset(desc, 0, descLen);
     return iconv(i_cd, inbuf, &srcLen, outbuf, &descLen);
 }
 
 size_t TranslateSP::convert(const char *from_charset, const char *to_charset,
         char *src, size_t srcLen, char *desc, size_t descLen)
 {
     char **inbuf = &src;
     char **outbuf = &desc;
     iconv_t cd = iconv_open(to_charset, from_charset);
     if ((iconv_t)-1 == cd) return (size_t)-1;
     memset(desc, 0, descLen);
     size_t n = iconv(cd, inbuf, &srcLen, outbuf, &descLen);
     iconv_close(cd);
     return n;
 }
 
 int main(int argc, char *argv[])
 {
     char *str = "我爱zhong国! %#@#";
     char *str1 = "i大量需要转换的编码";
     char *str2 = "函数就是用于将hello进行转换";
     char newstr[MAX_LEN];
     TranslateSP tsp;
     tsp.convert("utf-8", "gbk", str, strlen(str), newstr, MAX_LEN);
     printf("%s\n", newstr);
     TranslateSP newtsp("UTF-8", "GBK");
     newtsp.translate(str1, strlen(str1), newstr, MAX_LEN);
     printf("%s\n", newstr);
     newtsp.translate(str2, strlen(str2), newstr, MAX_LEN);
     printf("%s\n", newstr);
     return 0;
 }

编译:

g++ translateSP.cpp -o test
./test
我爱zhong国! %#@#
i大量需要转换的编码
函数就是用于将hello进行转换

(以上输出是GBK编码)

怎样学习使用libiconv库的更多相关文章

  1. 利用VS编译libiconv库

    参考文章:http://blog.csdn.net/ghevinn/article/details/9834119 关于中文字符编码问题,这篇文章里面讲的很详细-->http://www.tui ...

  2. linux下使用libiconv库转码

    iconv命令实现linux下字符集编码的转换 windows下的文件复制到linux下时常会乱码,因为windows下文件编码为GBK,linux下默认文件编码为UTF-8,故需要libiconv库 ...

  3. ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库

    ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库. 与现有的主要针对监督任务设计的深度学习库不同,ZhuSuan 的特点是深入到贝叶斯推理中,从而支持各种生成模式:传 ...

  4. libiconv库的安装和使用

    1.libiconv包的下载路径 包的下载页面http://www.gnu.org/software/libiconv/ 2.编译安装libiconv库 $tar zxvf libiconv-1.14 ...

  5. 常见的LINUX发行版安装libiconv库方法

    今天编译程序,发现程序报错,如下 cannot find -liconv collect2: ld returned 1 exit status 或者 undefined reference to ` ...

  6. Python学习day45-数据库(总结)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  7. Python学习day44-数据库(单表及多表查询)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  8. Python学习day43-数据库(多表关系)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. Python学习day42-数据库的基本操作(1)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

随机推荐

  1. Nginx 配置指令的执行顺序(五)

    Nginx 的 content 阶段是所有请求处理阶段中最为重要的一个,因为运行在这个阶段的配置指令一般都肩负着生成“内容”(content)并输出 HTTP 响应的使命.正因为其重要性,这个阶段的配 ...

  2. DataSet 中的数据排序 及 DataRow装成DataTable

    1.DataSet 中的数据排序 DataSet ds = new DataSet(); // 获取当前排口的数据 ds = _xiaobill.GetHistoryData(yinZiBianm, ...

  3. Chapter 1. Hello, Perl/Tk

    Chapter 1. Hello, Perl/Tk 内容: Perl/Tk Concepts Some Perl/Tk History Getting Started with Perl/Tk Hel ...

  4. 获取windows身份认证网站页面内容

    有些网站必须登录才能获取到页面内容. 代码如下,可获取数据. var url = "https://yunda-api-test.appspot.com/int/parcel?wait=tr ...

  5. K-th Number(第k大数)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 45710   Accepted: 15199 Ca ...

  6. UVA11387 - The 3-Regular Graph(推理)

    题目链接 题意:给n个点,问能否画出一个无向图.且每一个顶点连接3条边.假设能够的话输出连接的边. 思路:当添加一条边时,总的无向图的度数会添加2,所以度数之和n*2为偶数.当n为奇数时,度数之和为奇 ...

  7. jquery的clone办法bug修复

    发现测试,textarea和select的jquery的clone有问题的方法,textarea和select值clone时间会输.这是发现jquery一个bug,上不了的能够看下代码.比較简单.就是 ...

  8. Swift版音乐播放器(简化版),swift音乐播放器

    这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...

  9. php预定义常量&变量

    PHP中可以使用预定义常量获取PHP中的信息,常用的预定义常量如下表所示. 常量名 功能  _FILE_ 默认常量,PHP程序文件名 _LINE_ 默认常量,PHP程序行数  PHP_VERSION ...

  10. 从一个小例子认识SQL游标

    1    什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...