Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > сохранение файлов в различных кодировках


Автор: artsb 4.1.2008, 00:26
Не подскажите, как научить программу сохранять файлы в выбранной кодировке. Типа как у блокнота. Спасибо.

Автор: JackYF 4.1.2008, 00:34
Цитата(artsb @  4.1.2008,  00:26 Найти цитируемый пост)
сохранять файлы в выбранной кодировке.

Перекодировать в нужную кодировку, сохранить smile

Автор: artsb 4.1.2008, 12:43
Цитата(JackYF @  4.1.2008,  00:34 Найти цитируемый пост)
Перекодировать в нужную кодировку, сохранить  smile 

Ну, до этого я сразу додумался.  smile 
Больше интересует: КАК это сделать (перекодировать)? Может есть какие-нибудь библиотеки или алгоритмы?

Автор: Fazil6 4.1.2008, 13:00
Цитата(artsb @  4.1.2008,  11:43 Найти цитируемый пост)
Больше интересует: КАК это сделать (перекодировать)? Может есть какие-нибудь библиотеки или алгоритмы?

библиотека iconv

Добавлено через 2 минуты и 44 секунды
http://forum.vingrad.ru/topic-181795/hl/iconv/index.html

Автор: Crut 4.1.2008, 14:00
Вот пример:
Код

typedef AnsiString as;
void code_line(as &g){
  for(int a=0; a < StrLen(g.c_str()); a++){
   ch_shd(g[a]);
 }
}

void ch_shd(char &a){
 char ret;
 switch(a){
 //русский
 //верх. строка
  case 'й': ret = 'q';break;
  case 'ц': ret = 'w';break;
  case 'у': ret = 'e';break;
  case 'к': ret = 'r';break;
  case 'е': ret = 't';break;
  case 'н': ret = 'y';break;
  case 'г': ret = 'u';break;
  case 'ш': ret = 'i';break;
  case 'щ': ret = 'o';break;
  case 'з': ret = 'p';break;
  case 'х': ret = '[';break;
  case 'ъ': ret = ']';break;
 //ср. строка
  case 'ф': ret = 'a';break;
  case 'ы': ret = 's';break;
  case 'в': ret = 'd';break;
  case 'а': ret = 'f';break;
  case 'п': ret = 'g';break;
  case 'р': ret = 'h';break;
  case 'о': ret = 'j';break;
  case 'л': ret = 'k';break;
  case 'д': ret = 'l';break;
  case 'ж': ret = ';';break;
  case 'э': ret = '\'';break;
  //нижн. строка
  case 'я': ret = 'z';break;
  case 'ч': ret = 'x';break;
  case 'с': ret = 'c';break;
  case 'м': ret = 'v';break;
  case 'и': ret = 'b';break;
  case 'т': ret = 'n';break;
  case 'ь': ret = 'm';break;
  case 'б': ret = ',';break;
  case 'ю': ret = '.';break;
  case '.': ret = '/';break;
  //английский
  //верх.строка
  case 'q': ret = 'й';break;
  case 'w': ret = 'ц';break;
  case 'e': ret = 'у';break;
  case 'r': ret = 'к';break;
  case 't': ret = 'е';break;
  case 'y': ret = 'н';break;
  case 'u': ret = 'г';break;
  case 'i': ret = 'ш';break;
  case 'o': ret = 'щ';break;
  case 'p': ret = 'з';break;
  case '[': ret = 'х';break;
  case ']': ret = 'ъ';break;
    //ср. строка
  case 'a': ret = 'ф';break;
  case 's': ret = 'ы';break;
  case 'd': ret = 'в';break;
  case 'f': ret = 'а';break;
  case 'g': ret = 'п';break;
  case 'h': ret = 'р';break;
  case 'j': ret = 'о';break;
  case 'k': ret = 'л';break;
  case 'l': ret = 'д';break;
  case ';': ret = 'ж';break;
  case '\'': ret = 'э';break;
      //нижн. строка
  case 'z': ret = 'я';break;
  case 'x': ret = 'ч';break;
  case 'c': ret = 'с';break;
  case 'v': ret = 'м';break;
  case 'b': ret = 'и';break;
  case 'n': ret = 'т';break;
  case 'm': ret = 'ь';break;
  case ',': ret = 'б';break;
  case '/': ret = '.';break;
  default: ret = a;
 }
 a = ret;
}

Но эта по клаве, а для стандартов -  смотри таблицу.

Автор: JackYF 4.1.2008, 14:05
Crut, ужас какой... перепиши хоть со строками, что ли.

Автор: Crut 4.1.2008, 14:36
??? 

Автор: JackYF 4.1.2008, 14:44
Цитата(Crut @  4.1.2008,  14:00 Найти цитируемый пост)
case 'й': ret = 'q';break;
  case 'ц': ret = 'w';break;
  case 'у': ret = 'e';break;
  case 'к': ret = 'r';break;
  case 'е': ret = 't';break;
  case 'н': ret = 'y';break;
  case 'г': ret = 'u';break;
  case 'ш': ret = 'i';break;
  case 'щ': ret = 'o';break;
  case 'з': ret = 'p';break;
  case 'х': ret = '[';break;
  case 'ъ': ret = ']';break;
 //ср. строка
  case 'ф': ret = 'a';break;
  case 'ы': ret = 's';break;
  case 'в': ret = 'd';break;
  case 'а': ret = 'f';break;
  case 'п': ret = 'g';break;
  case 'р': ret = 'h';break;
  case 'о': ret = 'j';break;
  case 'л': ret = 'k';break;
  case 'д': ret = 'l';break;
  case 'ж': ret = ';';break;
  case 'э': ret = '\'';break;
  //нижн. строка
  case 'я': ret = 'z';break;
  case 'ч': ret = 'x';break;
  case 'с': ret = 'c';break;
  case 'м': ret = 'v';break;
  case 'и': ret = 'b';break;
  case 'т': ret = 'n';break;
  case 'ь': ret = 'm';break;
  case 'б': ret = ',';break;
  case 'ю': ret = '.';break;
  case '.': ret = '/';break;
  //английский
  //верх.строка
  case 'q': ret = 'й';break;
  case 'w': ret = 'ц';break;
  case 'e': ret = 'у';break;
  case 'r': ret = 'к';break;
  case 't': ret = 'е';break;
  case 'y': ret = 'н';break;
  case 'u': ret = 'г';break;
  case 'i': ret = 'ш';break;
  case 'o': ret = 'щ';break;
  case 'p': ret = 'з';break;
  case '[': ret = 'х';break;
  case ']': ret = 'ъ';break;
    //ср. строка
  case 'a': ret = 'ф';break;
  case 's': ret = 'ы';break;
  case 'd': ret = 'в';break;
  case 'f': ret = 'а';break;
  case 'g': ret = 'п';break;
  case 'h': ret = 'р';break;
  case 'j': ret = 'о';break;
  case 'k': ret = 'л';break;
  case 'l': ret = 'д';break;
  case ';': ret = 'ж';break;
  case '\'': ret = 'э';break;
      //нижн. строка
  case 'z': ret = 'я';break;
  case 'x': ret = 'ч';break;
  case 'c': ret = 'с';break;
  case 'v': ret = 'м';break;
  case 'b': ret = 'и';break;
  case 'n': ret = 'т';break;
  case 'm': ret = 'ь';break;
  case ',': ret = 'б';break;
  case '/': ret = '.';break;

не находишь, что этот код слишком избыточен и накосячить в нём - как пить дать?

Автор: Crut 4.1.2008, 14:53
C коментами что-ли?
Код

typedef AnsiString as;    //ансистринг переминовываем
void code_line(as &g){ // функция конирующая целую строку ансистринга    
  for(int a=0; a < StrLen(g.c_str()); a++){    //тута всё ясно
   ch_shd(g[a]);    //кодируем
 }    
}    
void ch_shd(char &a){     // функция коодинга
 char ret;    //то, чё возратить
 switch(a){    //ветвление
 //русский    
 //верх. строка    
  case 'й': ret = 'q';break; //тута ясно    
  case 'ц': ret = 'w';break;    
  case 'у': ret = 'e';break;    
  case 'к': ret = 'r';break;    
  case 'е': ret = 't';break;    
  case 'н': ret = 'y';break;    
  case 'г': ret = 'u';break;    
  case 'ш': ret = 'i';break;    
  case 'щ': ret = 'o';break;    
  case 'з': ret = 'p';break;    
  case 'х': ret = '[';break;    
  case 'ъ': ret = ']';break;    
 //ср. строка    
  case 'ф': ret = 'a';break;    
  case 'ы': ret = 's';break;    
  case 'в': ret = 'd';break;    
  case 'а': ret = 'f';break;    
  case 'п': ret = 'g';break;    
  case 'р': ret = 'h';break;    
  case 'о': ret = 'j';break;    
  case 'л': ret = 'k';break;    
  case 'д': ret = 'l';break;    
  case 'ж': ret = ';';break;    
  case 'э': ret = '\'';break;    
  //нижн. строка    
  case 'я': ret = 'z';break;    
  case 'ч': ret = 'x';break;    
  case 'с': ret = 'c';break;    
  case 'м': ret = 'v';break;    
  case 'и': ret = 'b';break;    
  case 'т': ret = 'n';break;    
  case 'ь': ret = 'm';break;    
  case 'б': ret = ',';break;    
  case 'ю': ret = '.';break;    
  case '.': ret = '/';break;    
  //английский    
  //верх.строка    
  case 'q': ret = 'й';break;    
  case 'w': ret = 'ц';break;    
  case 'e': ret = 'у';break;    
  case 'r': ret = 'к';break;    
  case 't': ret = 'е';break;    
  case 'y': ret = 'н';break;    
  case 'u': ret = 'г';break;    
  case 'i': ret = 'ш';break;    
  case 'o': ret = 'щ';break;    
  case 'p': ret = 'з';break;    
  case '[': ret = 'х';break;    
  case ']': ret = 'ъ';break;    
    //ср. строка    
  case 'a': ret = 'ф';break;    
  case 's': ret = 'ы';break;    
  case 'd': ret = 'в';break;    
  case 'f': ret = 'а';break;    
  case 'g': ret = 'п';break;    
  case 'h': ret = 'р';break;    
  case 'j': ret = 'о';break;    
  case 'k': ret = 'л';break;    
  case 'l': ret = 'д';break;    
  case ';': ret = 'ж';break;    
  case '\'': ret = 'э';break;    
      //нижн. строка    
  case 'z': ret = 'я';break;    
  case 'x': ret = 'ч';break;    
  case 'c': ret = 'с';break;    
  case 'v': ret = 'м';break;    
  case 'b': ret = 'и';break;    
  case 'n': ret = 'т';break;    
  case 'm': ret = 'ь';break;    
  case ',': ret = 'б';break;    
  case '/': ret = '.';break;    
  default: ret = a; //если не подходит - копировать как есть    
 }    
 a = ret; //присваиваем
}

// эта по клаве, а так:
 void ch_shd(char &a){
 a = a + 1;
}
Код




Добавлено через 2 минуты и 49 секунд
извеняюсь, за вопрос - можем тормозит....

Добавлено через 3 минуты и 17 секунд
(модем)

Автор: JackYF 4.1.2008, 15:00
Цитата(Crut @  4.1.2008,  14:53 Найти цитируемый пост)
C коментами что-ли?

причём тут комментарии? я говорю про то, что почему не юзается таблица перекодировки, а написано 60 строчек кода с захаркодеными символами?

Идём дальше. Представь, что тебе нужно будет сделать перекодировку в другую кодировку. Что ты будешь делать? Напишешь ещё 60 строчек кода? а если в 10 кодировок?

Автор: artsb 4.1.2008, 16:30
Crut я имел в виду не то, что ты написал. Я имею ввиду: как сделать чтобы сохранять файлы в кодировках, как у блокнота.

Fazil6 можешь написать примерчик использования библиотеки?

Автор: 586 4.1.2008, 17:44
Цитата(Crut @  4.1.2008,  14:53 Найти цитируемый пост)
void ch_shd(char &a){     // функция коодинга
 char ret;    //то, чё возратить
 switch(a){    //ветвление
 //русский    
 //верх. строка    
  case 'й': ret = 'q';break; //тута ясно    
  case 'ц': ret = 'w';break;    
  case 'у': ret = 'e';break;    
  case 'к': ret = 'r';break;    
........
  case ',': ret = 'б';break;    
  case '/': ret = '.';break;    
  default: ret = a; //если не подходит - копировать как есть    
 }    
 a = ret; //присваиваем

Вбей русскую раскладку в один массив, а английскую во второй (они должны быть одинаковой длины)  и кодируй.

Автор: Fazil6 4.1.2008, 17:55
Цитата(artsb @  4.1.2008,  15:30 Найти цитируемый пост)
Fazil6 можешь написать примерчик использования библиотеки?

а я что написал? 
http://forum.vingrad.ru/topic-181795/hl/iconv/index.html

Автор: artsb 4.1.2008, 19:39
Fazil6, я просто не совсем понял приведённый тобой пример. Можешь как-то подробнее объяснить и на конкретном примере, плиз.
И ещё вопрос: где взять таблицы кодировок и как ими пользоваться?
Спасибо.

Автор: Fazil6 4.1.2008, 20:10
Цитата(artsb @  4.1.2008,  18:39 Найти цитируемый пост)
Fazil6, я просто не совсем понял приведённый тобой пример. Можешь как-то подробнее объяснить и на конкретном примере, плиз.

пример конкретнейший. конкретней не придумаешь.
что непонятно?

Автор: s1lver 4.1.2008, 20:11
Цитата(artsb @ 4.1.2008,  19:39)
 где взять таблицы кодировок и как ими пользоваться?

В библиотеке iconv, только я сам хочу узнать как её кстановить, простым переносом файла в папку инклуд не выходит. smile 

Автор: Fazil6 4.1.2008, 20:18
Цитата(s1lver @  4.1.2008,  19:11 Найти цитируемый пост)
В библиотеке iconv, только я сам хочу узнать как её кстановить, простым переносом файла в папку инклуд не выходит

какого файла? 
Зачем вообще куда-то что-то переносить. Все что нужно - прописать путь к хедеру, путь к lib и подключить либу в список линкеру в проекте

Автор: s1lver 4.1.2008, 20:25
Цитата(Fazil6 @ 4.1.2008,  20:18)
Цитата(s1lver @  4.1.2008,  19:11 Найти цитируемый пост)
В библиотеке iconv, только я сам хочу узнать как её кстановить, простым переносом файла в папку инклуд не выходит

какого файла? 
Зачем вообще куда-то что-то переносить. Все что нужно - прописать путь к хедеру, путь к lib и подключить либу в список линкеру в проекте

так там куча файлов в архиве, какую папку прописывать непонятно. Вот я и нашел iconv.hpp и кинул в папку include

Автор: Fazil6 4.1.2008, 20:31
Цитата(s1lver @  4.1.2008,  19:25 Найти цитируемый пост)
так там куча файлов в архиве, какую папку прописывать непонятно. Вот я и нашел iconv.hpp и кинул в папку include

ну естественно, обычно ведь в архиве только один файл имеет значение. Остальные - так, для придания веса и солидности. Особенно всякие там readme и install

Автор: artsb 4.1.2008, 20:35
Цитата(Fazil6 @  4.1.2008,  20:10 Найти цитируемый пост)
что непонятно? 

что-то там много всего написано.  smile 
можешь просто написать: какой функцией, откуда и куда конвертировать.
А лучше, подскажи, где таблицы кодов взять.
Спасибо.

Автор: Fazil6 4.1.2008, 21:17
Цитата(artsb @  4.1.2008,  19:35 Найти цитируемый пост)
что-то там много всего написано. 

может быть стоит напрячься? 30 строк кода не так уж много. 
Код

namespace UTF8CONVERTER

это обертка для вызова непосредственно функций iconv. Включает в себя 2 функции, одна вызывает другую.

Код

std::string CONVERTER::UTF8ToWin1251(const std::string &val)
{
    return UTF8CONVERTER::conv( "windows-1251", "UTF-8", val);
}

std::string CONVERTER::Win1251ToUTF8(const std::string &val)
{
    return UTF8CONVERTER::conv("UTF-8", "windows-1251", val);    

}

неужели из этого примера непонятно 
Цитата

какой функцией, откуда и куда конвертировать

???

Добавлено через 7 минут и 24 секунды
Цитата(artsb @  4.1.2008,  19:35 Найти цитируемый пост)
А лучше, подскажи, где таблицы кодов взять.Спасибо.

а зачем тебе? Неужели читать документацию дольше и сложнее чем писать велосипеды. Сконвертировать из одной кодировки в другую не такая уж тривиальная задача в общем виде. Хотябы потому, что символы в разных кодировках имеют неодинаковую длину.

Если так уж хочешь узнать какой функцией куда, то открой iconv.h и посмотри. Там всег-то 5 функций. Причем в коментах подробно описаны все.

Автор: artsb 4.1.2008, 21:31
Fazil6, спасибо.

Автор: artsb 5.1.2008, 13:16
Fazil6
почему-то нету в архиве ни iconv.hpp, ни iconv.h. Где их взять?

Автор: artsb 5.1.2008, 13:43
А у Билдера, оказывается, есть свои средства. Вот, из справки:
user posted image
Мне этого хватит, нужно только разобраться. smile
И всётаки, почему нет в архиве ни iconv.hpp, ни iconv.h.

Автор: s1lver 5.1.2008, 17:05
Цитата(artsb @ 5.1.2008,  13:16)
Fazil6
почему-то нету в архиве ни iconv.hpp, ни iconv.h. Где их взять?

В архиве как раз и есть эти файлы, но вот как поставить чтобы все работало я что-то не врубился. smile 

Автор: artsb 5.1.2008, 17:57
Да нет там этих файлов. Всё перерыл, поиск юзал. Нет их там.

s1lver если можешь, выложи свой архив.
Устанавливается, вроде, так:
Меню Tools->Environment Options,
на вкладке Library,
жмёшь кнопку с тремя точками, напротив Library path, и добавляешь путь к папке с библиотекой.
Вот, вроде, и всё.

Автор: s1lver 6.1.2008, 16:45
Цитата(artsb @  5.1.2008,  17:57 Найти цитируемый пост)
Устанавливается, вроде, так:
Меню Tools->Environment Options,
на вкладке Library,
жмёшь кнопку с тремя точками, напротив Library path, и добавляешь путь к папке с библиотекой.
Вот, вроде, и всё. 


Понятное дело. Только к какой папки прописывать?


Цитата(artsb @  5.1.2008,  17:57 Найти цитируемый пост)
s1lver если можешь, выложи свой архив.


бериhttp://junpolit.narod.ru/libiconv-1.11.tar

Автор: artsb 6.1.2008, 17:20
Цитата(s1lver @  6.1.2008,  16:45 Найти цитируемый пост)
бериlibiconv-1.11.tar

Пишет: "Нет такой страницы".
Кстати у меня этот же архив - libiconv-1.11.tar
Странно, почему там нет этих файлов.
Ладно, не парься. Спасибо.

Цитата(s1lver @  6.1.2008,  16:45 Найти цитируемый пост)
Только к какой папки прописывать?

Пропиши к общей папке. Билдер сам найдёт. smile

Автор: s1lver 6.1.2008, 17:26
Цитата(artsb @  6.1.2008,  17:20 Найти цитируемый пост)
Пишет: "Нет такой страницы".

Усе правильно. Там ведь архив, я был уверен,что все нормально, тк. использую Download Master он все благополучно скачивает.
Цитата

Пропиши к общей папке. Билдер сам найдёт.
 Сейчас попробую

Автор: artsb 6.1.2008, 20:04
DownloadMaster не может закачать. Пишет ошибка. Ну да ладно.
А в каком каталоге у тебя лежит iconv.hpp?

Автор: s1lver 7.1.2008, 00:48
Цитата(artsb @  6.1.2008,  20:04 Найти цитируемый пост)
А в каком каталоге у тебя лежит iconv.hpp? 


Lib. Вот я прикрепил файл iconv.

Автор: artsb 7.1.2008, 12:21
iconv.c у меня есть. Но Fazil6 в своём примере подключал iconv.h, которого у меня нет.
Fazil6 разъясни ситуацию, плиз.

И ещё возник вопрос:
Содержимое файла, при его открытии, я помещаю в memo.
Если открываю файл, сохранённый в кодировке ANSI, то всё нормально. Но если файл был сохранён в другой кодировке (например, UTF-8), то в memo появляются всякие закорючки. Следовательно, нужно файл, при открытии, перевести в ANSI. Но как узнать в какой кодировке был сохранён открываемый файл?

Автор: Fazil6 7.1.2008, 13:33
ссылка на библиотеку 
Цитата(s1lver @  6.1.2008,  15:45 Найти цитируемый пост)
бериlibiconv-1.11.tar

 это в исходных кодах. Это нужно собирать. Как собирать описано в файле 
Install.generic и прочих readme

могу скинуть на мыло собраную версию 1.9 для Win32. Если что - PM

Автор: s1lver 9.1.2008, 09:33
Цитата(artsb @  7.1.2008,  12:21 Найти цитируемый пост)
Если открываю файл, сохранённый в кодировке ANSI, то всё нормально. Но если файл был сохранён в другой кодировке (например, UTF-8), то в memo появляются всякие закорючки. Следовательно, нужно файл, при открытии, перевести в ANSI. Но как узнать в какой кодировке был сохранён открываемый файл?


На мой взгляд можно просто преобразовывать файлы при открытии из UTF-8 в ANSI, без выявления кодировки...... smile 

Вот попробовал примерчик.

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iconv.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
namespace UTF8CONVERTER
{}
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{  
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (OpenDialog1->Execute()) Memo1->Lines->LoadFromFile(OpenDialog1->FileName);        
 std::string CONVERTER::UTF8ToWin1251(const std::string &val)
{
    return UTF8CONVERTER::conv( "windows-1251", "UTF-8", val);
}}
//---------------------------------------------------------------------------



Ошибки:
[C++ Error] Unit1.cpp(26): E2316 'string' is not a member of 'std'
[C++ Error] Unit1.cpp(26): E2379 Statement missing ;

Может я что-то не так понял? Что надопоместить в namespace UTF8CONVERTER{}? 

Автор: artsb 9.1.2008, 20:35
Цитата(s1lver @  9.1.2008,  09:33 Найти цитируемый пост)
На мой взгляд можно просто преобразовывать файлы при открытии из UTF-8 в ANSI, без выявления кодировки.....

Если он уже был в ANSI, то получатся закорючки.

Fazil6 говорит, что распознать не получится. Можно просто сделать меню с выбором кодировки.


s1lver а откуда у тебя iconv.h?  smile 

Автор: s1lver 9.1.2008, 20:42
Мне Fazil6 скинул на мыло.
Цитата

Если он уже был в ANSI, то получатся закорючки.


а у тебя уже есть работающий код? 

Автор: artsb 9.1.2008, 21:02
Цитата(s1lver @  9.1.2008,  20:42 Найти цитируемый пост)
а у тебя уже есть работающий код? 

Да нет, я решил обойтись встроенными средствами. А библитеку просто так взял. Всё равно пригодится.  smile 

Автор: s1lver 9.1.2008, 21:28
Цитата(artsb @  9.1.2008,  21:02 Найти цитируемый пост)
я решил обойтись встроенными средствами.


??? можешь подсказать?

Автор: artsb 9.1.2008, 21:56
Цитата(s1lver @  9.1.2008,  21:28 Найти цитируемый пост)
??? можешь подсказать?

Дык я ж ранее скриншот из хэлпа кидал. В хэлпе пиши "Character set conversions". А там разберёшься.
Я сам ещё толком не разбирался. Пока другим занят.

Автор: s1lver 20.1.2008, 15:18
нарыл тут один примерчик, сейчас буду пробовать


Код

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

LPSTR xcode(LPCSTR src, UINT srcCodepage, UINT dstCodepage)
{
int wsize = MultiByteToWideChar(srcCodepage, 0, src, -1, NULL, 0);
LPWSTR wbuf = (LPWSTR)malloc(wsize*sizeof(WCHAR));
MultiByteToWideChar(srcCodepage, 0, src, -1, wbuf, wsize);
int size = WideCharToMultiByte(dstCodepage, 0, wbuf, -1, NULL, 0, NULL, NULL);
LPSTR buf = (LPSTR)malloc(size);
WideCharToMultiByte(dstCodepage, 0, wbuf, -1, buf, size, NULL, NULL);
free(wbuf);
return buf;
}


void main()
{
LPSTR p;

p = xcode("Дайте выпить поскорей!", 1251, 20866);
printf("KOI-8: %s\n", p);
free(p);

p = xcode("Дайте выпить поскорей!", 1251, 866);
printf("DOS-866: %s\n", p);
free(p);

p = xcode("Дайте выпить поскорей!", 1251, CP_UTF8);
printf("UTF-8: %s\n", p);
free(p);
}

Автор: artsb 20.1.2008, 20:02
Цитата(s1lver @  20.1.2008,  15:18 Найти цитируемый пост)
нарыл тут один примерчик

Молодец. Пригодится...

Автор: KTatsu 25.11.2008, 04:46
Прошу простить за "некропостерство", но вопрос все еще в силе - как собрать библиотеку?
Ридми и инсталл я нашел, но толком ничего не понял из их содержания.

И тоже не совсем понял данный код:
Код

#include <iconv.h>

.....

//=======================================================================


namespace UTF8CONVERTER
{
    std::string convert(iconv_t cd, const std::string &val)
    {
        if(cd == (iconv_t)-1) return "";

        const size_t INBUFSIZE    =     val.length() + 1;
        const size_t OUTBUFSIZE    = 512;

        size_t x = INBUFSIZE;
        
        char *in_buf = new char[INBUFSIZE]; // удалить


        strncpy(in_buf, val.c_str(), val.length());
        in_buf[val.length()] = 0;
        const char * tbf = in_buf;


        std::string res;
        size_t con;
        while(x)
        {
            char out_buf[OUTBUFSIZE + 1];  
            char *pout_buf = out_buf;
            
            memset(pout_buf,0,OUTBUFSIZE + 1);
            
            size_t y = OUTBUFSIZE;
            con = iconv(cd, /*(const char**)*/&tbf, &x, &pout_buf, &y);
            
            res += out_buf;
            
        }
        delete [] in_buf;
        return res;
    }

    std::string conv(const char to[], const char from[], const std::string &val)
    {
        iconv_t cd = iconv_open(to, from);
        std::string r = convert(cd, val);
        iconv_close(cd);
        return r;    
    }


};
std::string CONVERTER::UTF8ToWin1251(const std::string &val)
{
    return UTF8CONVERTER::conv( "windows-1251", "UTF-8", val);
}

std::string CONVERTER::Win1251ToUTF8(const std::string &val)
{
    return UTF8CONVERTER::conv("UTF-8", "windows-1251", val);    
}
Я понял из какой кодировки в какую конвертируется, но я не понял как привязать данный код, скажем к мемо...

Автор: Infector 15.3.2009, 15:12
А можно еще вопрос небольшой:
нужно кодировку ДОС перегнать в Ansi, соответственно пишу код:

  for (int i=1; i<Memo2->Lines->Count; i++)
  {
   Memo1->Lines->Add(Utf8ToAnsi(Memo2->Lines->Strings[i]));
  }
В результате все запускается, но вместо преобразования кодировки получаю удаление строк с русскоязычными символами

Автор: xvr 16.3.2009, 19:46
ДОС - это не UTF8!

Автор: dumb 16.3.2009, 19:55
Infector, http://msdn.microsoft.com/en-us/library/ms647493(VS.85).aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)