С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.71
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
#1

Работа с кодировками файла (АНСИ и ЮТФ-8) - C++

17.12.2013, 17:56. Просмотров 5550. Ответов 41
Метки нет (Все метки)

Всем здрасти!

Подскажите пожалуйста, каким образом можно реализовать следующее:

1) Как программно преобразовать текст из ANSI в UTF-8, и наоборот из UTF-8 в ANSI?

2) Как для создаваемого файла установить кодировку UTF-8? ANSI?

3) Как, при открытии файла, можно определить его кодировку, чтобы если она не ANSI, преобразовать её в таковую?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2013, 17:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с кодировками файла (АНСИ и ЮТФ-8) (C++):

Работа с кодировками - C++
Всем привет. Есть следующая проблема: есть программа, которая загружает html код страницы с сайта. Затем из этого html кода необходимо...

Траблы с кодировками - C++
Задание звучит так: из заданной строчки вывести слова, в которых нет повторных букв struct IsGoodString : public...

Проблемы с кодировками - C++
Имеется имя файла, считанное с текущей директории (папки Windows). В имени присутствуют пробелы и кирилица. Как переименовать или...

Запись текста в файл разными кодировками - C++
Здравствуйте. Имеется файл. Нужно заменить кусок текста на текст другой кодировки. Как в С++ работать с кодировками? Еще ни разу не...

Делаю игру на русском, но возникла непонятка с кодировками - C++
Делаю игру на русском языке по нахождению антонимов. Использую setlocale, но когда вызываю функцию, которая проверяет правильность ответа и...

Работа с кодировками при чтении файла - C#
Здравствуйте! Пишу программу, одна из задач - реализовать чтение файла с сервера. Использую следующий код: var text = new...

41
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
17.12.2013, 18:51 #2
Цитата Сообщение от BESSON_off Посмотреть сообщение
2) Как для создаваемого файла установить кодировку UTF-8? ANSI?

3) Как, при открытии файла, можно определить его кодировку, чтобы если она не ANSI, преобразовать её в таковую?
По своей сути - никак. Кодировка файла - это некое подпольное знание, хранящееся вне файла. В самом файле нет никакой информации о том, какая у него кодировка. Какие-то потуги в виде специальных маркеров есть, но ни одна такая потуга не даст 100% гарантии
0
Alex5
1102 / 763 / 119
Регистрация: 12.04.2010
Сообщений: 1,934
17.12.2013, 20:41 #3
Цитата Сообщение от BESSON_off Посмотреть сообщение
Как программно преобразовать текст из ANSI в UTF-8
Можно использовать MultiByteToWideChar(), затем полученную строку wchar_t[] преобразовать в utf-8 с помощью WideCharToMultiByte().
C++
1
2
3
4
5
6
7
8
9
10
11
12
// #include <windows.h>
    char str[50] = "фыва qwer";
 
    wchar_t wstr[50];
    int num = ::MultiByteToWideChar( 1251, MB_PRECOMPOSED, str, -1, wstr, sizeof(wstr)/sizeof(wstr[0]) );
    // Returns the number of WCHAR 
    // wstr :  44 04 4b 04 32 04 30 04 20 00 71 00 77 00 65 00 72 00 00    D.K.2.0. .q.w.e.r... 
 
    char str2[100] = {};
    num = ::WideCharToMultiByte( CP_UTF8, 0, wstr, -1, str2, sizeof(str2)/sizeof(str2[0]), 0, 0 );
    // Returns the number of bytes 
    // str2 :  d1 84 d1 8b d0 b2 d0 b0 20 71 77 65 72 00    С.С.РІР° qwer.
1
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
17.12.2013, 23:43 #4
До кучи
Чем сконвертировать в русский язык такие крякозябры?
1
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
18.12.2013, 01:06 #5
Библиотека iconv
Но в некоторых фрейморках, есть свои средства работы с кодировками (например в Qt и VCL)


Цитата Сообщение от Evg Посмотреть сообщение
По своей сути - никак. Кодировка файла - это некое подпольное знание, хранящееся вне файла. В самом файле нет никакой информации о том, какая у него кодировка. Какие-то потуги в виде специальных маркеров есть, но ни одна такая потуга не даст 100% гарантии
100% нет, особенно если текст короткий.
Но тем не менее иногда 100% результат и не нужен.
Например где-то видел подобную реализацию на основе нейронных сетей.
1
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
19.12.2013, 15:50  [ТС] #6
Спасибо всем за участие в дискуссии...
Хочу конкретизировать проблему: скачивается блок информации из интернета, распарсивается и сохраняется информация в файл. Далее этот созданный файл использует другая программа. Так вот проблема заключается в том, что вторая программа не может получить данные из файла (они кстати на русском языке), т.к. файл создается в UTF-8.
Т.е. выходов из ситуации я вижу 2:
1) Сохранять создаваемый файл в кодировке ANSI.
2) При открытии файла другой программой, "на лету" перекодировать полученные данные из UTF-8 в ANSI.

Хотелось бы развиваться по первому сценарию, но если это не возможно, то согласен и на 2-ой вариант.

Какие есть механизмы для реализации этого? (и если можно поподробнее)
0
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
19.12.2013, 15:58 #7
У тебя есть "устная" договорённость между первой и второй программой о том, что файл в UTF8. Т.е. первая программа при формировании файла должна знать, что файл в UTF8, а вторая - должна знать это же самое, но при чтении

Можно так же использовать маркер в самом начале файла - http://ru.wikipedia.org/wiki/Byte_order_mark, но это не панацея, а нанотехнология

Добавлено через 1 минуту
Точно так же можно организовать "устную" договорённость о том, что файл должен быть в какой-то из ANSI'шных кодировок.
0
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
19.12.2013, 16:31 #8
Что мешает непосредственное содержание блока помещать в xml или html файл, в этих форматах ведь предусмотрено указание кодировки. А значит и вторая программа при чтении будет знать что-там и в какой кодировки.

Но я бы рекомендовал сведение всех данных в UTF-8 изначально при их получении. (как бы по договоренности)
0
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
19.12.2013, 16:34 #9
Цитата Сообщение от Avazart Посмотреть сообщение
Но я бы рекомендовал сведение всех данных в UTF-8 изначально при их получении. (как бы по договоренности)
+1. Мне тоже этот способ видится наиболее правильным
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
19.12.2013, 18:17  [ТС] #10
Цитата Сообщение от Avazart Посмотреть сообщение
Но я бы рекомендовал сведение всех данных в UTF-8 изначально при их получении. (как бы по договоренности)
Они и имеют кодировку при создании файла UTF-8, но я хочу переконвертировать находящееся в файле перед использованием этих данных для другой программы. Она анализирует русские символы в этом файле, а кодировка UTF-8 русские символы не хочет показывать...

Цитата Сообщение от Evg Посмотреть сообщение
вторая - должна знать это же самое, но при чтении
Как указать подобное?

Цитата Сообщение от Avazart Посмотреть сообщение
Что мешает непосредственное содержание блока помещать в xml или html файл, в этих форматах ведь предусмотрено указание кодировки. А значит и вторая программа при чтении будет знать что-там и в какой кодировки.
Как это реализовать. html меня вполне бы устроил...

P.S. что вы называете договоренностями?
0
Evg
Эксперт CАвтор FAQ
18381 / 6429 / 441
Регистрация: 30.03.2009
Сообщений: 17,845
Записей в блоге: 28
19.12.2013, 18:24 #11
Цитата Сообщение от BESSON_off Посмотреть сообщение
а кодировка UTF-8 русские символы не хочет показывать
Это не кодировка не хочет показывать, а твоя программа не умеет с ними работать (поскольку она думает, что это ASCII)

Цитата Сообщение от BESSON_off Посмотреть сообщение
Как указать подобное?
Это нигде не указывается. Это данность. Т.е. ты сам с собой договорился и в первой программе всегда пишешь UTF8, а во второй - читаешь UTF8
0
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
19.12.2013, 20:12 #12
Цитата Сообщение от Evg Посмотреть сообщение
а кодировка UTF-8 русские символы не хочет показывать
Это не кодировка не хочет показывать, а твоя программа не умеет с ними работать (поскольку она думает, что это ASCII)
BESSON_off, Это и имели ввиду под договорённостями что обе программы умеют работать с толь или иной кодировкой.
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
20.12.2013, 15:04  [ТС] #13
Цитата Сообщение от Evg Посмотреть сообщение
Это нигде не указывается. Это данность. Т.е. ты сам с собой договорился и в первой программе всегда пишешь UTF8, а во второй - читаешь UTF8
Каким образом это реализовать?

Попробовал применить функцию MultiByteToWideChar следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::ifstream fin("f:\\Romka.txt");
if (!fin)
    return 1;
 
std::string strBuffer;
char ch;
 
while(fin.get(ch))
    strBuffer+=ch;
fin.close();
 
int size = MultiByteToWideChar(CP_ACP,0,strBuffer.c_str(),-1,NULL,0);
PWSTR temp = new wchar_t[size];
MultiByteToWideChar(CP_ACP,0,strBuffer.c_str(),-1,temp,size);
 
std::wstring wstrBuffer(temp); //контейнер, который нужно заполнить UTF
 
wcerr << wstrBuffer; //почему-то ничего не выводится
Почему то не выводится через std::wcerr<<wstrBuffer, c чем связана проблема? (буфер заполняется правильно)

Также попробовал, используя функцию WideCharToMultiByte перевести символы в ANSI. Файл (test.txt) в кодировке UTF-8.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SetConsoleOutputCP(1251);
std::wifstream wfin("f:\\test.txt");
if (!wfin)
    return -1;
 
TCHAR wch;
std::wstring wstrBuffer;
while(wfin.get(wch))
    wstrBuffer+=wch;
 
wfin.close();
 
int size = WideCharToMultiByte(CP_ACP,0,wstrBuffer.c_str(),-1,NULL,0,NULL,NULL);
PSTR temp = new char[size];
WideCharToMultiByte(CP_ACP,0,wstrBuffer.c_str(),-1,temp,size,NULL,NULL);
std::string strBuffer(temp);
cerr << endl << "STR: " << strBuffer << endl;
Почему-то все русские символы не распознались (выводятся как символы '?'), а английские символы вывелись нормально.
Что сделать, чтобы начал распознаваться русский язык в этом примере?
0
Alex5
1102 / 763 / 119
Регистрация: 12.04.2010
Сообщений: 1,934
20.12.2013, 16:57 #14
Цитата Сообщение от BESSON_off Посмотреть сообщение
c чем связана проблема? (буфер заполняется правильно)
Всё выводится правильно, если добавить
C++
1
    setlocale( LC_ALL, "" );
Файл (test.txt) в кодировке UTF-8.
C++
1
2
3
std::wifstream wfin("f:\\test.txt");
// ... 
while(wfin.get(wch))
Один символ может кодироваться в UTF-8 различным ( 1, 2, .. ) числом байт. А здесь get(wch); считывает по 2 байта. Может оказаться, что эти 2 байта относятся к различным символам исходного текста.
1
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
20.12.2013, 20:36  [ТС] #15
Цитата Сообщение от Alex5 Посмотреть сообщение
Один символ может кодироваться в UTF-8 различным ( 1, 2, .. ) числом байт. А здесь get(wch); считывает по 2 байта. Может оказаться, что эти 2 байта относятся к различным символам исходного текста.
И каким образом можно организовать копирование символов из файла UTF-8 в контейнер string с кодировкой ANSI?
0
20.12.2013, 20:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2013, 20:36
Привет! Вот еще темы с ответами:

Построчное чтение файла с разными кодировками (2 мя) - C#
Добрый день Требуется считать секционированный файл в котором на определенной секции (после определенной строки) меняется кодировка...

проблема с кодировками при вставке содержимого файла - C# ASP.NET
Прошу не пинать ногами, если такой вопрос был, я не нашел. Есть Asp-скрипт. В нем есть такая строка, к примеру: ...

Код анси - C (СИ)
Всем привет, я прошу помочь мне вот с этим: мне нужно сделать что то вроде шифровки, и получить правильный код анси(для дальнейшего...

Socket коректно принять кириллицу в Ютф-8 - Java ME
StringBuffer sb = new StringBuffer(); int c = 0; int lst = 0; while (((c = is.read())...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.