[РЕШЕНО] проблемы с iconv (ошибка EILSEQ(84))

Модератор: Модераторы разделов

Аватара пользователя
proton
Сообщения: 34
ОС: Gentoo Linux

[РЕШЕНО] проблемы с iconv

Сообщение proton »

Собственно задача - конвертация строчки из cp1251 в utf-8

Имеется код:

Код: Выделить всё

#include <stdio.h>
#include <iconv.h>
#include <errno.h>
#include <err.h>

int main() {
  iconv_t cd;
  size_t k, f, t;
  int se;
  char code[10];
  char buf[100];

  bzero(code,10);
  bzero(buf,100);

  FILE *file = fopen("myfile", "r");
  fseek (file , 0 , SEEK_END);
  size_t fsize = ftell (file);
  rewind (file);
  fread (code,1,fsize,file);
  fclose(file);

  const char* in = code;
  const char* out = buf;

  cd = iconv_open("CP1251", "UTF-8");
  if( cd == (iconv_t)(-1) )
    err( 1, "iconv_open" );
  f = strlen(code);
  t = sizeof buf;
  errno = 0;
  k = iconv(cd, &in, &f, &out, &t);
  se = errno;
  printf( "converted: %u,error=%d\n", (unsigned) k, se );

  iconv_close(cd);
  return 0;
}


при запуске выводит такое:

Код: Выделить всё

converted: 4294967295,error=84


при компиляции выдает:

Код: Выделить всё

test.c: В функции ‘main’
test.c:12: предупреждение: incompatible implicit declaration of built-in function ‘bzero’
test.c:28: предупреждение: incompatible implicit declaration of built-in function ‘strlen’
test.c:31: предупреждение: passing argument 2 of ‘iconv’ from incompatible pointer type
test.c:31: предупреждение: passing argument 4 of ‘iconv’ from incompatible pointer type


Собственно, в чем проблема?

PS: myfile - файл в кодировке cp1251, содержащий слово "привет"
PPS: если поменять UTF-8 на KOI8-R - конвертит нормально
PPPS: код ошибки EILSEQ(84) означает "на входе для обработки находится неправильная многобайтовая последовательность"

Всем заранее спасибо за помощь
Шаман, ставший богом...
Бог, лишенный силы...
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: [РЕШЕНО] проблемы с iconv

Сообщение sergio »

proton писал(а):
14.10.2007 10:15
test.c:12: предупреждение: incompatible implicit declaration of built-in function ‘bzero’
test.c:28: предупреждение: incompatible implicit declaration of built-in function ‘strlen’
test.c:31: предупреждение: passing argument 2 of ‘iconv’ from incompatible pointer type
test.c:31: предупреждение: passing argument 4 of ‘iconv’ from incompatible pointer type[code]

Собственно, в чем проблема?


1) откуда функция bzero? берется
2) string.h проинклудить надо
3) и 4) iconv берет указатели на char* (оба) а не const char*

PPS: если поменять UTF-8 на KOI8-R - конвертит нормально

Откуда куда конвертите, проверьте. Обычно в юникод конвертится все. В коях есть какие-то символы, которые айконв не любит, вроде.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: [РЕШЕНО] проблемы с iconv

Сообщение sergio »

В догонку.

Хаха. Этого я и боялся. У айконва индусский порядок аргументов при открытии хэндла.

Код: Выделить всё

  cd = iconv_open("CP1251", "UTF-8");

Код: Выделить всё

— Function: iconv_t iconv_open (const char *tocode, const char *fromcode)

Думаю, на этом вопрос "почему не конвертит" можно считать закрытым. :)
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
proton
Сообщения: 34
ОС: Gentoo Linux

Re: [РЕШЕНО] проблемы с iconv

Сообщение proton »

благодарю)
Шаман, ставший богом...
Бог, лишенный силы...
Спасибо сказали: