Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.71
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
17.12.2013, 17:56     Работа с кодировками файла (АНСИ и ЮТФ-8) #1
Всем здрасти!

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

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

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

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

C++ С++ работа с текстом из файла
C++ Данные.работа с данными из файла ?
Проблемы с кодировками C++
Запись текста в файл разными кодировками C++
Работа со структурами и чтением из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
21.12.2013, 14:05     Работа с кодировками файла (АНСИ и ЮТФ-8)
  #21

Не по теме:

Цитата Сообщение от DU Посмотреть сообщение
немного в сторону от темы:
бывает, что файлы маркируются спец образом (Byte order mark, BOM):
См. пост #7

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
21.12.2013, 14:58  [ТС]     Работа с кодировками файла (АНСИ и ЮТФ-8) #22
Цитата Сообщение от Alex5 Посмотреть сообщение
Пример. Преобразование из utf-8 в wide char:
MultiByteToWideChar(CP_UTF8, ... );
Касаемо этого - В инструкции к функции MultiByteToWideChar первый аргумент - "Параметр задает номер кодовой страницы, связанной с мультибайтовой строкой". Т.е. при преобразовании из ANSI в UTF-8 нужно будет указать CP_ACP (ANSI).

На данный момент у меня к форумчанам 2 просьбы:
1) Может кто-нибудь напишет код, как в контейнер string можно вытянуть данные в формате ANSI (русские символы интересуют в том числе) из файла с кодировкой UTF-8, прикрепленного к этому сообщению (Text.txt)

2) Почему не записывается в поток информация в следующем примере:
C++
1
2
3
4
5
6
setlocale(LC_ALL,"");
std::wofstream wfout ("f:\\temp.txt");
if (!wfout)
return -1;
wfout<<L"Январь"; //Тут трабл
wfout.close();
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
21.12.2013, 15:02  [ТС]     Работа с кодировками файла (АНСИ и ЮТФ-8) #23
Кстати, вот вложение
Вложения
Тип файла: txt Text.txt (1.9 Кб, 7 просмотров)
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
21.12.2013, 15:19     Работа с кодировками файла (АНСИ и ЮТФ-8) #24
Если проект юникодный, то все должно быть юникодным. Кодировку советую UTF-8, все работы производить с std::wstring, std::wifstream, std::wofstream.
Да и еще:
C++
1
2
3
4
5
// задаем корректный формат вывода. C++11
void make_UTF16_output(std::wostream& out)
{
    out.imbue(std::locale(out.getloc(), new std::codecvt_utf8<wchar_t>));
}
wifstream и wofstream открывать в бинарном режиме (работают с файлами UTF8).

В свое время я много часов потратил, чтобы понять, что поганая студия не может записать в файл "как есть", а где-то глубоко в недрах вызывает WideCharToMultiByte.
Есть еще вариант извращенный, если С++11 нет возможности использовать:
открывать файл через fopen с флагом ccs=UTF-8 и далее передавать указатель на файловую переменную в поток.
http://msdn.microsoft.com/en-us/library/yeby3zcb.aspx

И последний вариант: iconv
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
21.12.2013, 15:34     Работа с кодировками файла (АНСИ и ЮТФ-8) #25
Цитата Сообщение от BESSON_off Посмотреть сообщение
Т.е. при преобразовании из ANSI в UTF-8 нужно будет указать CP_ACP (ANSI)
Нету такого преобразования

На всякий случай немного теории Сложности понимания работы utf-8 и ascii

Та часть преобразования, которая описана в имени как "MultiByte" - условно говоря это конкретный тип кодировки (Win1251, koi8, UTF8, UTF16 и т.п.). Та часть, которая описана в имени как "WideChar" - это есть wchar_t, или unicode (универсальное представление для хранения текстов, абстрагированное от какой-либо конкретной кодировки, обычно являющееся 4-байтным типом). Т.е. если ты хочешь преобразовать из ANSI в UTF8, то ты делаешь через два преобразования: ANSI -> WideChar, а потом WideChar -> UTF8

Alex5 в посте #18 пытался донести до тебя эту мысль.

MultiByteToWideChar - преобразование из кодировки, которая задаётся параметром в WideChar (unicode)
WideCharToMultiByte - преобразование из WideChar (unicode) в кодировку, которая задаётся параметром

Т.е. преобразование между любыми двумя кодировками всегда делается через промежуточное преобразование в WideChar (которое, в свою очередь, НЕ является кодировкой, а является ПРЕДСТАВЛЕНИЕМ данных)
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
21.12.2013, 15:52     Работа с кодировками файла (АНСИ и ЮТФ-8) #26
Вероятно стоило изначально задать вопросы ТС:

1. В какой кодировке 1-я программа получает значения с сайта? В обще что сайт и что делает программа №1. ?
2. Что за таинственная программа №2?
3. Какую среду разработки использует ТС?

А то так далеко можно пойти ...
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
21.12.2013, 19:23  [ТС]     Работа с кодировками файла (АНСИ и ЮТФ-8) #27
Цитата Сообщение от Avazart Посмотреть сообщение
какой кодировке 1-я программа получает значения с сайта? В обще что сайт и что делает программа №1. ?
Первая программа скачивает страницу сайта. Далее парсит ее (достает нужные мне данные) и сохраняет найденные данные в файл. (тут программа сама создает файл в UTF-8 (без BOM), я бы предпочел ANSI).
Цитата Сообщение от Avazart Посмотреть сообщение
Что за таинственная программа №2?
Далее данные из этого файла подкачивают другие 2 программы, которые работают с этими данными. Но они не могут себе в контейнер string загрузить данные из этого файла, так как русский язык не распознается (английские символы проблем не создают).
Цитата Сообщение от Avazart Посмотреть сообщение
Какую среду разработки использует ТС?
MVS2012
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
21.12.2013, 19:41     Работа с кодировками файла (АНСИ и ЮТФ-8) #28
BESSON_off,Не хочешь пояснять, так и быть решай сам свои проблемы.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
21.12.2013, 19:44     Работа с кодировками файла (АНСИ и ЮТФ-8) #29
Если необходимо работать с русскими символами, то
Цитата Сообщение от MrGluck Посмотреть сообщение
все должно быть юникодным. Кодировку советую UTF-8, все работы производить с std::wstring, std::wifstream, std::wofstream.
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
21.12.2013, 20:06  [ТС]     Работа с кодировками файла (АНСИ и ЮТФ-8) #30
Цитата Сообщение от Avazart Посмотреть сообщение
Не хочешь пояснять, так и быть решай сам свои проблемы.
Я же все пояснил...
Создается файл через ofstream и записываются в него данные через cURL. После данные (распарсенные/русский язык) сохраняются в файл. И этот файл читают в будущем другие программы, но они этого сделать не могут, так как файл сохраняется (почему-то) в кодировке UTF-8... Вот...

Добавлено через 56 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
все должно быть юникодным. Кодировку советую UTF-8, все работы производить с std::wstring, std::wifstream, std::wofstream.
Русский язык не распознается

Добавлено через 9 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
все должно быть юникодным. Кодировку советую UTF-8, все работы производить с std::wstring, std::wifstream, std::wofstream.
У меня почему-то данный пример не работает, а без записи в поток я не смогу использовать это:
C++
1
2
3
4
5
6
setlocale(LC_ALL,"");
std::wofstream wfout ("f:\\temp.txt");
if (!wfout)
return -1;
wfout<<L"Январь"; //Тут трабл
wfout.close();
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
21.12.2013, 20:57     Работа с кодировками файла (АНСИ и ЮТФ-8) #31
Цитата Сообщение от BESSON_off Посмотреть сообщение
Создается файл через ofstream и записываются в него данные через cURL. После данные (распарсенные/русский язык) сохраняются в файл. И этот файл читают в будущем другие программы, но они этого сделать не могут, так как файл сохраняется (почему-то) в кодировке UTF-8.
Как только curl запишет все данные и файл будет закрыт, откройте его,
считайте его содержимое в буфер, затем выполните MultiByteToWideChar(CP_UTF8, ...),
затем WideCharToMultiByte(CP_ACP, ...), - или, что еще лучше, с указанием точной
выходной кодировки, например 1251, если Вы ее знаете, - а затем сохраните обратно.
Правда, у юникода значительно больший диапазон, чем у ANSI-кодировок, поэтому
не удивляйтесь, если некоторые исходные символы будут потеряны.

Кстати, есть и другой, концептуально более правильный, способ -
попросить сервер сразу отдавать данные в нужной кодировке.
Например, в HTTP для этого есть заголовок "Accept-charset".
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
21.12.2013, 21:03     Работа с кодировками файла (АНСИ и ЮТФ-8) #32
Цитата Сообщение от BESSON_off Посмотреть сообщение
wfout<<L"Январь"; //Тут трабл
что значит трабл?
Кодировка страницы исходника какая?
Выберите в студии дополнительные параметры сохранения и далее UTF-8 (там по умолчанию ANSI идет)
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
21.12.2013, 21:32     Работа с кодировками файла (АНСИ и ЮТФ-8) #33
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, в HTTP для этого есть заголовок "Accept-charset".
Ну так сервер на это ответит своим charset : text/html; charset=windows-1251 и больше нечего ...
Миниатюры
Работа с кодировками файла (АНСИ и ЮТФ-8)  
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,391
Завершенные тесты: 1
21.12.2013, 21:44     Работа с кодировками файла (АНСИ и ЮТФ-8) #34
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так сервер на это ответит своим charset : text/html; charset=windows-1251 и больше нечего.
Ну это не значит, что все серверы ведут себя так же.
В RFC 2616 (HTTP/1.1) сказано, что если сервер не может отдать контент в
запрашиваемой через accept-charset кодировке, ему следует вернуть код 406.
Хотя и отдать ответ в другой кодировке не возбраняется.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
21.12.2013, 22:07     Работа с кодировками файла (АНСИ и ЮТФ-8) #35
C https://www.google.com.ua та же штука...
Я по крайней мере не разу не видел что бы серв менял кодировку.

Добавлено через 4 минуты
Цитата Сообщение от BESSON_off Посмотреть сообщение
Я же все пояснил...
Что ты пояснил ? что там у тебя за программы? Какие из них твои какие других производителей ?
Документацию тех программ смотрел ?
Какой тип контента и с какого конкретно сайта скачивается ?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
22.12.2013, 01:33     Работа с кодировками файла (АНСИ и ЮТФ-8) #36
Цитата Сообщение от Avazart Посмотреть сообщение
Что ты пояснил ? что там у тебя за программы? Какие из них твои какие других производителей ?
Документацию тех программ смотрел ?
Какой тип контента и с какого конкретно сайта скачивается ?
Переведу на русский язык. Ты выдал проблему в абстрактном виде. Тебе в абстрактном теоретическом виде объяснили, как её исправить. Но твоих знаний/навыков не хватает, чтобы понять абстрактное пояснение. Дальше либо ты предоставляешь исходники, либо разбираешься с проблемой сам, потому что конкретное решение тебе могут выдать только при конкретной постановке задачи: покажи конерктный сайт, покажи файл, который скачивается, покажи файл, который генерирует программа N1 и т.п. По другому вопрос зайдёт в тупик. Либо ты ещё раз перечитаешь то, что тут написали и попытаешься, наконец, вникнуть в написанное
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
22.12.2013, 01:48     Работа с кодировками файла (АНСИ и ЮТФ-8) #37
http://local.joelonsoftware.com/wiki...BB%D0%BE%D0%B2
Хорошую статью стоит прочитать интересующимся.
Многие вопросы отпадут и может кого-то осенит в решении проблемы. (сам не вникал во все посты)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 01:52     Работа с кодировками файла (АНСИ и ЮТФ-8) #38
Цитата Сообщение от Evg Посмотреть сообщение
Ты выдал проблему в абстрактном виде.
У ТС есть вполне неабстрактный вопрос:
Цитата Сообщение от BESSON_off Посмотреть сообщение
У меня почему-то данный пример не работает, а без записи в поток я не смогу использовать это:
C++
1
2
3
4
5
6
setlocale(LC_ALL,"");
std::wofstream wfout ("f:\\temp.txt");
if (!wfout)
return -1;
wfout<<L"Январь"; //Тут трабл
wfout.close();
Трабл в том, что в файл ничего на записывается.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
22.12.2013, 01:53     Работа с кодировками файла (АНСИ и ЮТФ-8) #39
Цитата Сообщение от alsav22 Посмотреть сообщение
У ТС есть вполне неабстрактный вопрос
"Тут трабл" - это ОЧЕНЬ абстрактная постановка проблемы
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2013, 01:59     Работа с кодировками файла (АНСИ и ЮТФ-8)
Еще ссылки по теме:

Работа со строками текстового файла C++
Работа со строкой из файла C++
Создание файла и работа с ним C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 01:59     Работа с кодировками файла (АНСИ и ЮТФ-8) #40
Цитата Сообщение от Evg Посмотреть сообщение
"Тут трабл" - это ОЧЕНЬ абстрактная постановка проблемы
Не понял. Это насчёт этого кода?
Yandex
Объявления
22.12.2013, 01:59     Работа с кодировками файла (АНСИ и ЮТФ-8)
Ответ Создать тему
Опции темы

Текущее время: 02:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru