linux下的编码转化问题,函数iconv的使用

2024-12-26 02:42:03
推荐回答(2个)
回答1:

看起来你的代码没什么问题啊:
#include

size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);

你看函数原型, outbuf是一个 char **类型
在函数手册中:
The iconv() function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements
*inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of converted
output bytes

也就是说,当你执行过iconv以后,*outbuf所指向的内存空间位置已经被改掉了, 所以你任何时候去读*outbuf, 都是读不到任何iconv后的数据的(都在*outbuf这个指针前面放着呢)。

所以你应该 预先备份outbuf的数据,
比如 char k[1000]; char *outb = k; 执行完iconv(t,&inb,&inl,&outb,&outl)以后,你去读k数组就可以了。

回答2:

int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
char *pin = inbuf;
char *pout = outbuf;

memset(outbuf,0,outlen);
return iconv(cd,&pin,(size_t *)&inlen,&pout,(size_t *)&outlen);
}

这样就可以了