size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)函数的用法
size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)函数的用法.
查了很久,总是看到说iconv会改变inbuf和outbuf的指向,但是就是找不到具体用法。
这里是我写的一个测试函数,在处理的时候,总是只处理前半部分字符串,是为什么?
#include <iconv.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * icon(char *str, const char *fromcode, const char *tocode);
int main ()
{
char a[] = " a汉字99@#$99汉字en&%\0";
printf("原始: %s \n",a);
icon(a, "UTF-8", "GBK");
printf("更改: %s \n",a);
icon(a, "GBK", "UTF-8");
printf("还原: %s \n",a);
getchar();
return 0;
}
char * icon(char *str, const char *fromcode, const char *tocode)
{
size_t inlen = sizeof(str);
iconv_t cd = iconv_open(tocode, fromcode);
size_t outlen = inlen * 4;
char *outbuf = (char *)malloc(outlen);
if (!outbuf)
{
exit(1);
}
memset(outbuf, 0, outlen);
char *in = str;
char *out = outbuf;
if (-1 == iconv(cd, &in, (size_t *)&inlen, &out, &outlen))
exit(1);
outlen = strlen(outbuf);
strcpy(str, outbuf);
free(outbuf);
iconv_close(cd);
return str;
}
size_t inlen = sizeof(str);
复习指针哦.
size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)
inbuf、inbytesleft、outbuf和outbytesleft都是变参,既传入数据又传出数据。
这个函数是要连续调用的,一次调用有可能不能完全处理所有输入(数据可能不完整),不能将转换后的数据完全输出(输出缓冲区满,事先无法知道需要多大的输出缓冲区),这几个变参就是用来处理这个问题的。
调用完成后:
*inbuf指向下一个输入位置,也就是剩余未处理的数据首字节,下一次调用应该从这里开始,或将这里的数据复制到缓冲区头部再调用。
inbytesleft中则是剩余未处理的输入数据字节数
*outbuf指向下一个输出位置,此前的数据为正确的转换结果,由此开始的数据则不是。下次调用时输出应由此开始或将此前的数据复制到其它处(比如与某个字符串连接、写入文件等)。
outbytesleft中存放转换完成但尚未输出的内容。
这个函数应该循环调用直到返回值为0。