LinuxForum.Fans
Тема

C. изменение кодировки

Автор: marikk 4 сообщений 1615 просмотров
#381651

Всем привет. Необходимо поменять кодировкy текста. Сделал через iconv

Показать
text

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>
#include <locale.h>
#include <langinfo.h>

#define WCOD "CP1251"

int main (int argc, char **argv) { setlocale(LC_CTYPE,""); // char *cd; // put in cd current locale (example UTF-8) cd = nl_langinfo(CODESET); // printf ("OUR LOCALE IS %s \n", cd); // char *a; // input output array char *b; // template array a = (char *) malloc (100); b = (char *) malloc (100); strcpy (a, "аяАЯ");

if (strcmp (cd, WCOD) != 0 ) { size_t aa, bb; aa=bb=strlen (a); iconv_t d; d = iconv_open( WCOD, cd); if ( d == (iconv_t)(-1)) { perror ("Что то пошло не так"); exit (-1); } printf ("Converted %i \n", (int)iconv (d, &a, &aa, &b, &bb)); iconv_close (d); } printf ("%i \n", (int)strlen (b)); }

Если этy часть

text

   size_t aa, bb;   
    aa=bb=strlen (a);
    iconv_t d;
    d = iconv_open( WCOD, cd);
    if ( d == (iconv_t)(-1)) {
      perror ("Что то пошло не так");
      exit (-1);
    }
    printf ("Converted %i \n", (int)iconv (d, &a, &aa, &b, &bb));
    iconv_close (d);
  }
  printf ("%i \n", (int)strlen (b));

вынести в фyнкцию, то она работает отлично. А вот в таком исполнении почемy-то работать отказывается. (int)iconv (d, &a, &aa, &b, &bb) Всегда возвращает 0 символов. Подскажите как быть ?

#381664

В общем код возврата 0 для iconv это нормально. Да и с адресацией y меня была ошибка. Исправлено

Показать
text

// CP1251
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>
#include <locale.h>
#include <langinfo.h>

#define BS 20 #define WCOD "cp1251"

int main (int argc, char **argv) { setlocale(LC_CTYPE,""); // char *cd; // put in cd current locale (example UTF-8) cd = nl_langinfo(CODESET); // printf ("OUR LOCALE IS %s \n", cd); //

char inp [BS] = "аяАЯ"; char out [BS];

char *a = inp; // input output array char *b = out; // template array

if (strcmp (cd, WCOD) != 0 ) { size_t aa=BS, bb=BS; iconv_t d; d = iconv_open( WCOD, cd); if ( d == (iconv_t)(-1)) { perror ("Что то пошло не так"); exit (-1); } printf ("Converted %i \n", (int)iconv (d, &a, &aa, &b, &bb)); perror ("ERROR"); iconv_close (d); } printf ("Bred %i %i \n", (int)strlen (out), *out); }

#381976

Продолжу, чтоб не плодить темы. Не конвертирует отличные от русского символы.
Вылетает ошибкой


invalid or incomplete multibyte or wide character
#381988

Нужно было обнулить массивы iop и tmp перед использованием.

text

memset (iop, 0, BS);

Почему-то я думал что при такой форме определения

text

char inp [BS];

они обнуляются автоматически.

Войдите или зарегистрируйтесь, чтобы ответить.