i`ym in linux中的iConv()。
我认为这已经完成了..
,但是我遇到了一些麻烦..
我认为两个代码是相同的,但第一个代码不起作用。只有第二个工作。
#include "stdio.h"
#include "string.h"
#include "iconv.h"
#include "errno.h"
#if 1
int fn2Utf8(char inBuf[], char outBuf[]) {
size_t readBytes = sizeof(inBuf);
size_t writeBytes = sizeof(outBuf);
char* in = inBuf;
char* out = outBuf;
iconv_t convert = iconv_open("UTF-8","UTF-16LE");
if (iconv(convert, &in, &readBytes, &out, &writeBytes) < 0) {
return (-1);
}
iconv_close(convert);
printf("[%s] [%s]n", inBuf, outBuf);
return (out - outBuf);
}
int main() {
char inBuf[128] ="x5cx00xbdxacx01xc6x00xd3x5cx00x00xb3x78xc6x44xbex5cx00x2ax00x00x00";
char outBuf[128];
fn2Utf8(inBuf, outBuf);
return 0;
}
#else
int main() {
char inBuf[128] = "x5cx00xbdxacx01xc6x00xd3x5cx00x00xb3x78xc6x44xbex5cx00x2ax00x00x00";
char outBuf[128];
size_t readBytes = sizeof(inBuf);
size_t writeBytes = sizeof(outBuf);
char* in = inBuf;
char* out = outBuf;
iconv_t convert = iconv_open("UTF-8","UTF-16LE");
if (iconv(convert, &in, &readBytes, &out, &writeBytes) < 0) {
return (-1);
}
iconv_close(convert);
printf("[%s] [%s]n", inBuf, outBuf);
return 0;
}
#endif
您可以将两种类型的代码与0->如果1
相结合我需要1个方法。
这是问题:
size_t readBytes = sizeof(inBuf);
size_t writeBytes = sizeof(outBuf);
当您将阵列传递到函数时,它们 em 将指针转到其第一个元素。您的电话
fn2Utf8(inBuf, outBuf);
等于
fn2Utf8(&inBuf[0], &outBuf[0]);
这意味着在函数中,参数不是数组,而是 pointers 。当您在指针上执行sizeof
时,您会得到指针的大小,而不是指向。
有两个解决方案:第一个解决方案是将数组的长度作为参数传递给该函数,然后使用它。第二,至少对于inBuf
参数,是依靠它是一个null终止的字符串并使用strlen
的事实。
第二种方式使用strlen
,如我已经说过的,仅在inBuf
上工作,但在outBuf
上不起作用,您必须使用第一种方式并将大小作为参数传递。
如果在没有功能的程序中工作,因为这样您就在上进行 sizeof
,而不是指针。当您有一个数组而不是指针时,sizeof
将为您的大小在数组的字节中提供大小。