红联Linux门户
Linux帮助

使用libiconv库处理linux下字符编码转换的问题

发布时间:2008-04-03 01:13:13来源:红联作者:tvnet
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
#include
#include
#include

#define OUTLEN 255

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不适合该方式,一是内存的限制不能一次调用,二是若分多次调用会频繁打开一个编码管道(通道),导致资源浪费,最好的办法还是拆开该函数根据情况使用。
文章评论

共有 0 条评论