iconv_t iconv_open (const char* tocode, const char* fromcode);这个函数返回一个把formcode编码的字符串转换成tocode编码的字符串的转换描述符。 如果发生错误返回(iconv_t)-1,同时设置errno。 2)iconv 函数原型为:
size_t iconv(iconv_t cd,这个函数利用iconv_open返回的转换描述符执行实际的转换操作。inbuf代表需要转换编码的字符地址,inbytesleft代表需要转换的字符个数地址,outbuf代表需要转换后的字符存放地址,outbytesleft代表存放转换后字符的最大个数地址。这个函数会修改传进来的参数,所以,要用另外用四个变量来表示这个地址。
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
函数执行失败返回(size_t)-1,errno被设置,否则,返回以不可逆的方式转换的字符个数,可逆转换的字符个数没有统计。 3)iconv_close
函数原型为:
int iconv_close (iconv_t cd);这个函数关闭之前调用iconv_open返回的描述符,释放内存空间,如果成功返回0,否则返回-1,errno被设置。 例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>
#define BUFSIZE 1024
int utf2gbk(char *buf, size_t len)
{
iconv_t cd = iconv_open("GBK", "UTF-8");
if (cd == (iconv_t)-1) {
perror("获取字符转换描述符失败!\n");
return -1;
}
size_t sz = BUFSIZE * BUFSIZE;
char *tmp_str = (char *)malloc(sz);
// 不要将原始的指针传进去,那样会改变原始指针的
size_t inlen = len;
size_t outlen = sz;
char *in = buf;
char *out = tmp_str;
if (tmp_str == NULL) {
iconv_close(cd);
fprintf(stderr, "分配内存失败!\n");
return -1;
}
memset(tmp_str, 0, sz);
if (iconv(cd, &in, &inlen, &out, &outlen) == (size_t)-1) {
iconv_close(cd);
return -1;
}
iconv_close(cd);
return 0;
}
int main(int argc, char *argv[])
{
char in[BUFSIZE] = "nihao1nih年后";
int len = strlen(in);
printf("%s\n", in);
utf2gbk(in, len);
printf("%s\n", in);
return 0;
}
参考:http://www.cnblogs.com/xuxm2007/archive/2010/11/09/1872379.html