LINUX.ORG.RU

Re: Покажите, пожалуйста, пример использования iconv

man iconv | читаем
iconv -l | смотрим и удивляемся сколько всего iconv знает
iconv -f UTF-8 -t WINDOWS-1251 <file.txt>

anonymous ()

Re: Re: Покажите, пожалуйста, пример использования iconv

может человеку нужно воспользоваться функцией из libc. тогда man 3 iconv. После его чтения, я окончательно понял, что реализацию iconv писали "странные" люди.

grustnoe ★★ ()

Re: Re: Re: Покажите, пожалуйста, пример использования iconv

"Станные" - мягко сказано. Когда в первый раз ее использовал - прыгал вокруг 10 строчек кода с дебагером часа 3, мне и в голову не приходило, что ТАК можно намутить :)

PETER ★★ ()

Re: Re: Re: Re: Покажите, пожалуйста, пример использования iconv

Я уже двое суток прыгаю. Я не знаю, как использовать функцию iconv(). В документации только описание параметров функции. Покажите, пожалуйста, реально работающий пример использования этой функции.

anonymous ()

Re: Покажите, пожалуйста, пример использования iconv

Я как пример взял исходники самого iconv, файл iconv.c, там есть функция convert(), которая собственно и преобразует кодировку файла поблочно.

AVI ()

Re: Покажите, пожалуйста, пример использования iconv

/*
 * возвращает сконвертированую строку, а в size оная длина
 * ВНИМАНИЕ: сконвертированую строку я не терминировал NULL(ём),
 * т.к. для двух- (и более)- байтовых кодировок это не принесёт 
 * большой пользы.
 */
char * 
conv_charset(const char *from, const char *to, char *str, int *size)
{
    char *out;
    
    if (*size <= 0) {
        out = istrdup("");
    } else {
        char *buf, *holder;
        int insize, outsize, bufsize, r;
        iconv_t cd; 

        cd = iconv_open(to, from);
        if (cd == (iconv_t) - 1)
            return NULL;

        insize = *size;
        outsize = bufsize = insize * 4;

        buf = (char *) imalloc(bufsize);
        holder = buf;

        r = iconv(cd, &str, &insize, &buf, &outsize);
        if (r < 0 || insize != 0) {
            free(holder);
            iconv_close(cd);
            return NULL;
        }


        *size = bufsize - outsize;

        buf -= *size;
        out = (char *) imalloc(*size);
        memcpy(out, buf, *size);
        free(holder);
        iconv_close(cd);
    }

    return out;
}

/* imalloc и istrdup - врапперы вокруг соотвественых функций */

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