Как правильно использовать libiconv в C, чтобы он не выдавал «Arg list too long»? - PullRequest
0 голосов
/ 25 февраля 2020

Код

/*char* to wchar_t* */
wchar_t*strtowstr(char*str){
    iconv_t cd=iconv_open("wchar_t","UTF-8");
    if(cd==(iconv_t)-1){
        return NULL;
    }
    size_t len1=strlen(str),len2=1024;
    wchar_t*wstr=(wchar_t*)malloc((len1+1)*sizeof(wchar_t));
    char*ptr1=str;
    wchar_t*ptr2=wstr;
    if((int)iconv(cd,&ptr1,&len1,(char**)&ptr2,&len2)<0){
        free(wstr);
        iconv_close(cd);
        return NULL;
    }
    *ptr2=L'\0';
    iconv_close(cd);
    return wstr;
}

Я использую strerror(errno), чтобы получить сообщение об ошибке, которое говорит: «Список аргументов слишком длинный».
Как я могу решить эту проблему? Благодаря комментариям я изменяю приведенный выше код.
Я просто использую функцию для чтения текстового файла. Я думаю, что он сообщает об ошибке, потому что файл слишком большой. Итак, я хочу знать, как использовать iconv для длинной строки .

1 Ответ

0 голосов
/ 25 февраля 2020

Согласно справочной странице, вы получаете E2BIG, когда недостаточно места на *outbuf.

Я думаю, что пятым аргументом должно быть число байтов .

wchar_t *utf8_to_wstr(const char *src) {
    iconv_t cd = iconv_open("wchar_t", "UTF-8");
    if (cd == (iconv_t)-1)
        goto Error1;

    size_t src_len = strlen(src);                 // In bytes, excludes NUL
    size_t dst_len = sizeof(wchar_t) * src_len;   // In bytes, excludes NUL
    size_t dst_size = dst_len + sizeof(wchar_t);  // In bytes, including NUL
    wchar_t *buf = malloc(dst_size);
    if (!buf)
        goto Error2;

    wchar_t *dst = buf;
    if (iconv(cd, &(char*)src, &src_len, &(char*)dst, &dst_len) == (size_t)-1)
        goto Error3;

    *dst = L'\0';
    iconv_close(cd);
    return buf;

Error3:
    free(buf);
Error2:
    iconv_close(cd);
Error1:
    return NULL;
}
...