【发布时间】:2015-01-14 20:19:08
【问题描述】:
我正在使用一个库,该库具有一个函数,该函数在标准 char * 中返回编码为 UTF-16LE(我很确定)的结果字符串,以及字符串中的字节数。我想将这些字符串转换为 UTF-8。我尝试了这个问题的解决方案:Convert UTF-16 to UTF-8 under Windows and Linux, in 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 中使用,因此我认为虽然它可能更丑陋,但我将在那里执行字符串转换。它只是工作。
【问题讨论】:
-
我认为它已经在 C 中为你工作了。你误解了结果。很可能,您错过了
iconv()更新输出缓冲区指针值的含义。 -
@JohnBollinger 所以也许原来的输出缓冲区有预期的输出,只是指针不再指向原来的?
-
是的,正是如此。
iconv()应该让它指向缓冲区中紧跟转换后的数据的位置。这就是为什么,正如我在更新的答案中所包含的那样,如果您实际上需要保留原始指针的值(这并不总是需要,但您可能确实需要)。 -
@JohnBollinger 我对此进行了一些测试,看来这就是答案。我声明的初始输出缓冲区最终确实保存了正确转换的字符串 - 我只是丢失了指向所述缓冲区的指针。
标签: c encoding utf-8 character-encoding utf-16le