Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: C и кодировки  (Прочитано 905 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
C и кодировки
« : 27 Июня 2011, 02:10:59 »
Имеется программа, которая разбирает html-файл. Но он в кодировке cp1251 и содержит русские символы, которые в полученной строке отображаются как неизвестные. Как можно перевести их в нормальный юникод?

Оффлайн yorik1984

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 1592
  • Кто не хочет, ищет причины
    • Просмотр профиля
Re: C и кодировки
« Ответ #1 : 27 Июня 2011, 02:14:52 »

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Re: C и кодировки
« Ответ #2 : 27 Июня 2011, 02:21:37 »
Не вариант. Это нужно проделать внутри программы.

Оффлайн yorik1984

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 1592
  • Кто не хочет, ищет причины
    • Просмотр профиля
Re: C и кодировки
« Ответ #3 : 27 Июня 2011, 02:23:14 »
вариант. Написать скрипт, который сначала использует Iconv  для преобразования кодировки, а потом уже программа на Си будет делать то что ей надо.

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: C и кодировки
« Ответ #4 : 27 Июня 2011, 02:31:22 »
man 3 iconv
Не?

Оффлайн __v1tos

  • Участник
  • *
  • Сообщений: 105
  • Ubuntuu 10.10 x86-64
    • Просмотр профиля
Re: C и кодировки
« Ответ #5 : 27 Июня 2011, 21:13:48 »
взял linux.org.ru

static void cp1251_to_utf8(char *out, const char *in) {
    static const int table[128] = {                   
        0x82D0,0x83D0,0x9A80E2,0x93D1,0x9E80E2,0xA680E2,0xA080E2,0xA180E2,
        0xAC82E2,0xB080E2,0x89D0,0xB980E2,0x8AD0,0x8CD0,0x8BD0,0x8FD0,   
        0x92D1,0x9880E2,0x9980E2,0x9C80E2,0x9D80E2,0xA280E2,0x9380E2,0x9480E2,
        0,0xA284E2,0x99D1,0xBA80E2,0x9AD1,0x9CD1,0x9BD1,0x9FD1,               
        0xA0C2,0x8ED0,0x9ED1,0x88D0,0xA4C2,0x90D2,0xA6C2,0xA7C2,             
        0x81D0,0xA9C2,0x84D0,0xABC2,0xACC2,0xADC2,0xAEC2,0x87D0,             
        0xB0C2,0xB1C2,0x86D0,0x96D1,0x91D2,0xB5C2,0xB6C2,0xB7C2,             
        0x91D1,0x9684E2,0x94D1,0xBBC2,0x98D1,0x85D0,0x95D1,0x97D1,           
        0x90D0,0x91D0,0x92D0,0x93D0,0x94D0,0x95D0,0x96D0,0x97D0,
        0x98D0,0x99D0,0x9AD0,0x9BD0,0x9CD0,0x9DD0,0x9ED0,0x9FD0,
        0xA0D0,0xA1D0,0xA2D0,0xA3D0,0xA4D0,0xA5D0,0xA6D0,0xA7D0,
        0xA8D0,0xA9D0,0xAAD0,0xABD0,0xACD0,0xADD0,0xAED0,0xAFD0,
        0xB0D0,0xB1D0,0xB2D0,0xB3D0,0xB4D0,0xB5D0,0xB6D0,0xB7D0,
        0xB8D0,0xB9D0,0xBAD0,0xBBD0,0xBCD0,0xBDD0,0xBED0,0xBFD0,
        0x80D1,0x81D1,0x82D1,0x83D1,0x84D1,0x85D1,0x86D1,0x87D1,
        0x88D1,0x89D1,0x8AD1,0x8BD1,0x8CD1,0x8DD1,0x8ED1,0x8FD1
    };
    while (*in)
        if (*in & 0x80) {
            int v = table[(int)(0x7f & *in++)];
            if (!v)
                continue;
            *out++ = (char)v;
            *out++ = (char)(v >> 8);
            if (v >>= 16)
                *out++ = (char)v;
        }
        else
            *out++ = *in++;
    *out = 0;
}



int main()
{
FILE *file;
unsigned long fsize;
char *buffer, *cp1251;

file = fopen("in.html", "r");

fseek(file, 0, SEEK_END);
fsize = ftell(file);
rewind(file);


cp1251 = new char[fsize + 4];
buffer = new char[fsize*2 + 4];


fread(cp1251, 1, fsize, file);

cp1251_to_utf8(buffer, cp1251);

buffer[fsize] = 0;
cp1251[fsize] = 0;

printf("cp1251:\n\n\n%s\n*****\nutf-8:\n\n\n\n%s", cp1251, buffer);

delete[] buffer;
delete[] cp1251;


fclose(file);

   
return 0;
}

AMD Phenom II 945, GA-MA790GPT-UD3H (HD 3300), 5 GiB ram

 

Страница сгенерирована за 0.038 секунд. Запросов: 26.