用于GB2312、UTF-8等字符编码的转换,一次转换需要调如下三个函数:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。
(3) int iconv_close(iconv_t cd);
此函数用于关闭转换句柄,释放资源。
注意:iconv函数的出参inbytesleft和outbytesleft的值会改变。
以上函数的使用可以根据需要自己封装成一个函数,万变不离其宗。
#include<stdio.h>
#include<iconv.h>
int main()
{
char inbuf[30] = "我是一只小小鸟";
char outbuf[120] = {0};
iconv_t cd = iconv_open("GBK", "UTF-8");
char *in = inbuf;
char *out = outbuf;
size_t inlen = 30;
size_t outlen = 120;
printf("1 in:%p, inbuf:%p, out:%p, outbuf:%p \n", in, out, inbuf, outbuf);
iconv(cd, &in, (size_t)&inlen, &out, &outlen);
outlen = strlen(outbuf);
printf("%s\n", outbuf);
printf("2 in:%p, inbuf:%p, out:%p, outbuf:%p \n", in, out, inbuf, outbuf);
iconv_close(cd);
}