我正在使用一个库,该库具有一个函数,该函数在标准 char * 中返回编码为 UTF-16LE(我很确定)的结果字符串,以及字符串中的字节数。我想将这些字符串转换为 UTF-8。我尝试了这个问题的解决方案:在 Windows 和 Linux 下将 UTF-16 转换为 UTF-8,在 C中说要使用 iconv,但结果是输入和输出缓冲区都为空。我错过了什么?
我的输入和输出缓冲区声明和初始化如下:
char *resbuff=NULL;
char *outbuff=NULL;
int stringLen;
size_t outbytes=1024;
size_t inbytes;
size_t convResult;
...
//some loop and control code here
...
if (resbuff==NULL) {
resbuff=(char *)malloc(1024);
outbuff=(char *)malloc(1024);
}
然后我调用库函数用数据填充rebuff。查看调试器中的缓冲区,我可以看到缓冲区中的数据。例如,如果数据是“测试”,我会在查看 rebuff 的各个索引时看到以下内容:
't','\0','e','\0','s','\0','t','\0'
我认为是 UTF-16LE(使用相同库的其他代码似乎可以证实这一点),并且 stringlen 现在等于 8。然后我尝试使用以下代码将其转换为 UTF-8:
iconv_t conv;
conv=iconv_open("UTF-8", "UTF-16LE");
inbytes=stringLen;
convResult=iconv(conv,&resbuff,&inbytes,&outbuff,&outbytes); //this does return 0
iconv_close(conv);
结果 outbuff 和 resbuff 都以空字符串结束。
请注意,我将 stringlen 声明为 int 而不是 unsigned long,因为这是库函数所期望的。
编辑:我根据下面 John Bollinger 的回答稍微调整了我的代码,但它并没有改变结果。
编辑 2:最终此代码的输出将在 Python 中使用,所以我认为虽然它可能更丑陋,但我将在那里执行字符串转换。它只是工作。