Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2013, 02:27   #1
Realism_32
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 17
По умолчанию utf-8 в koi8-r. Очень нужна помощь. С

Есть два файла. Один пустой, другой нет. Непустой файл содержит текст в кодировке UTF8. Программа должна переписать текст из этого файла в другой файл, имеющий кодировку koi8-r. Я пытался осуществить данную операцию в два этапа - сначала из utf-8 в ср1251 потом из ср1251 в koi-8.
Второй этап написан успешно и работает с помощью таблицы транслитерации. А на первом я конкретно застрял.
Помогите, пожалуйста, решить эту проблему, или, если такое чудо вообще возможно, помогите с кодом utf-8 в koi8-r.
Перерыл за две недели весь гугл, но решения так и не откопал.



Основных трудностей две - нельзя использовать библиотеку iconv и средства WinApi.

Приведу коды, чтобы внести ясность:
В данном коде окончательно запутался. Не могу передать под файловый ввод\вывод и разобраться как объявить функции:

Код:
CStringA UTF16to1251(const CStringW& utf16)
{
   CStringA utf8;
   int len = WideCharToMultiByte(1251, 0, utf16, -1, NULL, 0, 0, 0);
   if (len>1)
   { 
      char *ptr = utf8.GetBuffer(len-1);
      if (ptr) WideCharToMultiByte(1251, 0, utf16, -1, ptr, len, 0, 0);
      utf8.ReleaseBuffer();
   }
   return utf8;
}
 
CStringW UTF8toUTF16(const CStringA& utf8)
{
   CStringW utf16;
   int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
   if (len>1)
   { 
      wchar_t *ptr = utf16.GetBuffer(len-1);
      if (ptr) MultiByteToWideChar(CP_UTF8, 0, utf8, -1, ptr, len);
      utf16.ReleaseBuffer();
   }
   return utf16;
}
 
CStringA UTF8to1251(const CStringA& utf8)
{
    return(UTF16to1251(UTF8toUTF16(utf8)));
}

Это вторая часть. Берется текст из файла и при помощи таблицы транслитерации переводится из ср1251 в koi8
Код:
#include <stdio.h>
#include <stdlib.h>

char pXlat[256] =
{
   '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', 
   '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F', 
   '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27', '\x28', '\x29', '\x2A', '\x2B', '\x2C', '\x2D', '\x2E', '\x2F', 
   '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37', '\x38', '\x39', '\x3A', '\x3B', '\x3C', '\x3D', '\x3E', '\x3F', 
   '\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47', '\x48', '\x49', '\x4A', '\x4B', '\x4C', '\x4D', '\x4E', '\x4F', 
   '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57', '\x58', '\x59', '\x5A', '\x5B', '\x5C', '\x5D', '\x5E', '\x5F', 
   '\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67', '\x68', '\x69', '\x6A', '\x6B', '\x6C', '\x6D', '\x6E', '\x6F', 
   '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77', '\x78', '\x79', '\x7A', '\x7B', '\x7C', '\x7D', '\x7E', '\x7F', 
   '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', 
   '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x2D', '\x97', '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F', 
   '\xA0', '\xA1', '\xA2', '\xA3', '\xA4', '\xA5', '\xA6', '\xA7', '\xB3', '\xA9', '\xAA', '\xAB', '\xAC', '\xAD', '\xAE', '\xAF', 
   '\xB0', '\xB1', '\xB2', '\xB3', '\xB4', '\xB5', '\xB6', '\xB7', '\xA3', '\x23', '\xBA', '\xBB', '\xBC', '\xBD', '\xBE', '\xBF', 
   '\xE1', '\xE2', '\xF7', '\xE7', '\xE4', '\xE5', '\xF6', '\xFA', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF', '\xF0', 
   '\xF2', '\xF3', '\xF4', '\xF5', '\xE6', '\xE8', '\xE3', '\xFE', '\xFB', '\xFD', '\xFF', '\xF9', '\xF8', '\xFC', '\xE0', '\xF1', 
   '\xC1', '\xC2', '\xD7', '\xC7', '\xC4', '\xC5', '\xD6', '\xDA', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF', '\xD0', 
   '\xD2', '\xD3', '\xD4', '\xD5', '\xC6', '\xC8', '\xC3', '\xDE', '\xDB', '\xDD', '\xDF', '\xD9', '\xD8', '\xDC', '\xC0', '\xD1' 
};


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

int main(int  argc, char*argv[])
{

int i = 0;

FILE* f2 = fopen(argv[1],"rb");
FILE* out = fopen(argv[2],"wb");

if (!f2 || !out)
{
// Error
return -1;
}

while ((i = fgetc(f2)) != EOF)
{
fputc(pXlat[(unsigned char)i],out);
}

fclose (f2);
fclose (out);

return 0;
}

Последний раз редактировалось Realism_32; 01.12.2013 в 23:10. Причина: хочу дописать код
Realism_32 вне форума Ответить с цитированием
Старый 01.12.2013, 10:51   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Из UTF8 получится только в Unicode а из Unicode можно прямо в koi8.

Начинайте читать здесь: http://ru.wikipedia.org/wiki/UTF-8
waleri вне форума Ответить с цитированием
Старый 01.12.2013, 13:33   #3
Realism_32
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 17
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Из UTF8 получится только в Unicode а из Unicode можно прямо в koi8.

Начинайте читать здесь: http://ru.wikipedia.org/wiki/UTF-8
Спасибо, но теорию на википедии уже изучил. Вы можете хотябы примерный исполняемый код показать?
Realism_32 вне форума Ответить с цитированием
Старый 01.12.2013, 13:46   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Самое простое - с помощью MultiByteToWideChar преобразовать из utf8 в юникод, а потом с помощью WideCharToMultiByte преобразовать его в нужную кодовую страницу.
Son Of Pain вне форума Ответить с цитированием
Старый 01.12.2013, 17:08   #5
Realism_32
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Son Of Pain Посмотреть сообщение
Самое простое - с помощью MultiByteToWideChar преобразовать из utf8 в юникод, а потом с помощью WideCharToMultiByte преобразовать его в нужную кодовую страницу.

что-то на подобии этого?
Код:
char src[] = {"УХЭЕУФЧЙФЕМШОПЕ"}; // слово "существительное"
int wsize = MultiByteToWideChar(CP_UTF8, 0, src, -1, NULL, 0);
LPWSTR wbuf = (LPWSTR)malloc(wsize*sizeof(WCHAR));
MultiByteToWideChar(CP_UTF8, 0, src, -1, wbuf, wsize);
int size = WideCharToMultiByte(CP_UTF16, 0, wbuf, -1, NULL, 0, NULL, NULL); // какую уазать CodePage
LPSTR buf = (LPSTR)malloc(size);
WideCharToMultiByte(CP_UTF16, 0, wbuf, -1, buf, size, NULL, NULL); // какую уазать CodePage
ShowMessage(wbuf);
free(wbuf);
Realism_32 вне форума Ответить с цитированием
Старый 01.12.2013, 18:07   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

А, что, можно использовать средства WINAPI?
waleri вне форума Ответить с цитированием
Старый 01.12.2013, 19:22   #7
Realism_32
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 17
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А, что, можно использовать средства WINAPI?
К сожалению, нельзя.
Realism_32 вне форума Ответить с цитированием
Старый 01.12.2013, 20:20   #8
Realism_32
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 17
По умолчанию

или можно... Программирование происходит в Linux
gcc

Помогите, пожалуйста, с кодом.
Realism_32 вне форума Ответить с цитированием
Старый 02.12.2013, 10:13   #9
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Работать-nj оно работает, тока все равно не понял, занафига stdшники в свой hash_map засунули функцию сравнения?
Вложения
Тип файла: zip Utf-8_to_KOI-8.zip (11.8 Кб, 37 просмотров)

Последний раз редактировалось Smogg; 02.12.2013 в 18:05.
Smogg вне форума Ответить с цитированием
Старый 02.12.2013, 19:01   #10
Realism_32
Пользователь
 
Регистрация: 01.12.2013
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
Работать-nj оно работает, тока все равно не понял, занафига stdшники в свой hash_map засунули функцию сравнения?
Благодарю, сижу осмысляю как работает )
Realism_32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень нужна помощь c матрицами, макросами в Excel. Заранее благодарен(поверьте, очень-очень нужна помощь) Farridjan Помощь студентам 1 03.07.2009 12:24
Очень нужна помощь с написанием программы... срочно(буду благодарен за помощь) 5Paladin5 Помощь студентам 3 02.07.2009 09:12
Очень нужна помощь! Нужно найти ошибку в очень простой программе. Lex55555777 Помощь студентам 3 07.12.2008 20:32