LINUX.ORG.RU

iconv


0

0

Кто-нибудь юзал сабж? Имеется ввиду не программа а API из iconv.h.
Чего-то у меня не особо получается. Может кусок кода приведете?

anonymous

/* это частный случай, здесь заранее известно сколько было байт в строке, и сколько получится после преобразования */

iconv_t from_utf;

/* ... */

from_utf = iconv_open(encoding_name, "utf-8");
if (from_utf == (iconv_t)(-1))
    return NULL;

/* .... */

/* преобразовываем строку in из cnt байт в строку out из out_cnt байт */

converted = iconv(from_utf, (char**)&in, &cnt, (char**)&out, &out_cnt);
if ((cnt) || (converted == (size_t)-1))
{
    iconv(p->encoding->from_utf, NULL, NULL, NULL, NULL);
    fprintf(stderr, "iconv error\n");
            return -1;
}

/* ..... */
iconv_close(from_utf);

anonymous
()

Вот в таком виде не работает. Ошибок не вылезает, но полученную строку печатать отказывается. Т.е. она попросту пустая.

char *to_buf;
size_t sz_to, nconv;

...

iconv_t conv_des = iconv_open("KOI8-R", "WINDOWS-1251");
if (conv_des == (iconv_t)(-1)) {
fprintf(stderr, "Error!");
return -1;
}
sz_to = sz_from;
while (sz_to > 0) {
nconv = iconv(conv_des, &from_buf, &sz_from, &to_buf, &sz_to);
}
if (nconv == (size_t) -1)
{
fprintf(stderr, "Error!");
return -1;
}
iconv_close(conv_des);
fprintf(stdout, "%s", to_buf);
}

И с явным приведением типов пробовал. Один хрен.

anonymous
()

Нет под руками манов, но если я правильно помню, то iconv измняет переменные to_buf и from_buf (не зря же они передаются по ссылке). Поэтому попробуй перед iconv написать

char *from = from_buf; char *to = to_buf;

а печать измени на

fprintf(stdout, "%s", to);

Кстати, там не стоит '\n', поэтому вывод будет вестись в буфер и до fprintf("\n") или fflush(stdout) ты ничего не увидишь.

anonymous
()

Точно! Меняет. Вот ведь как :). Спасибо за помощь.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.