LINUX.ORG.RU

Затык с iconv (на С)


0

0

Блин, глаза слипаются, с С уже года полтора не сталкивался. Памажыте, плз... 

Вроде все как надо.. Где ошибка (кроме ДНК)


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

int main(){
  
  size_t ret;
  size_t size1;
  size_t size2;
  
  char *inp;
  char *res;

  iconv_t link;

  link = iconv_open("WINDOWS-1251","KOI8-R");

  res = (char *)malloc(50);
  inp = (char *)malloc(50);

  scanf("%s",inp);

  size1 = strlen(inp);
  size2 = size1;
  
  printf("input: \"%s\" (length: %d)\n",inp,size1);
  ret = iconv(link,(char **) &inp, &size1, (char **)&res, &size2);
  printf("result: %d, errno: %d\n",ret,errno);
  printf("ouput: \"%s\" (length: %d %d)\n",res,strlen(res),size2);
  printf("decoded: %i of %i\n",size2,size1);
  iconv_close(link);

  return 0;

}


Запускаю сие так: 
gcc testiconv.c -o testiconv ; echo "фвываыва"|./testiconv

Получаю:
input: "фвываыва" (length: 8)
result: 0, errno: 0
ouput: "d symbol: gconv_end" (length: 19 0)            (мусор в output, левая длина)
decoded: 0 of 0

При других комбинациях кодировок случается result=-1... 

glibc v2.3.4
★★★★★

Внимательно читаем маны:

it increments *inbuf and decrements *inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of converted output bytes

покрайней мере этот код работает:

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

int main(){

size_t ret, size1, size2;
char *inp, *res, *p1;

iconv_t link;

link = iconv_open("WINDOWS-1251","KOI8-R");

res = (char *)malloc(500); //хапнем побольше
inp = (char *)malloc(500);
p1 = res;

scanf("%s",inp);

size1 = strlen(inp);
size2 = size1;

printf("input: \"%s\" (length: %d)\n",inp,size1);
ret = iconv(link,(char **) &inp, &size1, (char **)&res, &size2);
printf("result: %d, errno: %d\n",ret,errno);
printf("ouput: \"%s\" (length: %d %d)\n",p1,strlen(res),size2);
printf("decoded: %i of %i\n",size2,size1);
iconv_close(link);

return 0;

}

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

Так.. Вроде работает.. Спасибо

Запутался я с этими incremented-decremented...

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