LINUX.ORG.RU

Не получается iconv cp1251 > utf8


0

1

Не могу разобраться в чем причина, код

char * CodeCharSet(char* in, const char* in_set, const char* out_set)
{
    iconv_t cd;
    size_t in_l = strlen(in), k;
    size_t out_l = in_l*2;
    char* out_buff = (char*)malloc(out_l*sizeof(char));
    char* out = out_buff;
    memset(out, 0, out_l);
    cd = iconv_open(out_set, in_set);
    if (cd != (iconv_t)-1)
    {
        iconv(cd, &in, &in_l, &out, &out_l);
        iconv_close(cd);
    }
    else memcpy(out_buff,in,in_l);
    return out_buff;
}
вызываю для примера (хотя для задачи нужно наоборот)

            char buf[256] = "БЛАБЛАБЛА";
            cout << buf << endl;
            CodeCharSet(buf, "UTF-8", "WINDOWS-1251");
            cout << buf << endl;

выходят оба в UTF8 ПОЧЕМУ???

★★★

патамушта


SYNOPSIS



#include <iconv.h>

size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);

<snip>

ERRORS

The iconv() function will fail if:
[EILSEQ]
Input conversion stopped due to an input byte that does not belong to the input codeset.
[E2BIG]
Input conversion stopped due to lack of space in the output buffer.
[EINVAL]
Input conversion stopped due to an incomplete character or shift sequence at the end of the input buffer.
The iconv() function may fail if:

[EBADF]
The cd argument is not a valid open conversion descriptor.

aol ★★★★★
()
Ответ на: комментарий от aol

aol

а поточнее не подскажите? попробовал уже разные варианты - никак не получается, вроде размеры везде нормально задал и типы и кодировки по разному писал.

wolverin ★★★
() автор топика
Ответ на: комментарий от wolverin

куда уж точнее? проверяй код возврата iconv(). возможные варианты в моем каменте выше.

aol ★★★★★
()
Ответ на: комментарий от wolverin

Проверяй и обрабатывай результат iconv, в случае успеха выведи обычным printf-ом, или что там у тебя вместо него, первые байты исходной и полученной строки. Как маленький, ей-богу.

arturpub ★★
()
Ответ на: комментарий от dmiceman

ахаха, wolverin, точно! это тоже :)

но проверку return values, в любом случае, никто не отменял! )

aol ★★★★★
()
Ответ на: комментарий от dmiceman

dmiceman

БХААААААААА )))) ТОЧНО!!!! СПАСИБО!!!!

wolverin ★★★
() автор топика
Ответ на: комментарий от dmiceman

Вообще, извини что радость нахождения баги отобрал. Очень приятная разновидность ошибок. И вроде и глупость мелкая, и день целый потратил, и вроде не зря. Мне такие баги нравятся. Особенно, когда не я их сажаю.

dmiceman ★★★★★
()

size_t out_l = in_l*2;

Так нельзя делать! НИ В КОЕМ СЛУЧАЕ! utf-8 символ может быть от 1 до 6 байт. Размер узнаётся благодаря соответствующей функции перекодировки (ртфм по iconv)

invy ★★★★★
()
Ответ на: комментарий от wolverin

С iconv не работал, потому сходу не скажу (мне тоже придётся гуглить, ага, вы и сами умеете).

Но это должно быть.

(Я б сразу сказал, какие, если б точно знал, мне ж не жалко :) )

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от invy

invy

так то все работает, только вот тут добавить надо size_t in_l = strlen(in)+1 а то были небольшие косяки.

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