C-使用ICONV()将UTF-16LE转换为UTF-8



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将为您的大小在数组的字节中提供大小。

最新更新