51代码网ORACLEMYSQLSQL SERVER其它数据库java/jspasp/asp.netC/C++/VC++APP应用其它语言服务器应用
您现在的位置: 51代码网 >> C >> 文章正文

size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft)函数的用法

更新时间:2013-6-23:  来源:51代码网

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。

[1] [2] 下一页

赞助商链接
推荐文章
  • 此栏目下没有推荐文章
  • {
    设为首页 | 加入收藏 | 友情链接 | 网站地图 | 联系站长 |