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

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

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

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

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
20.12.2013, 22:16 #16
Прочитать файл в буфер обычными байтовыми операциями, а дальше MultiByteToWideChar, WideCharToMultiByte
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 344
21.12.2013, 05:39  [ТС] #17
Цитата Сообщение от Evg Посмотреть сообщение
Прочитать файл в буфер обычными байтовыми операциями, а дальше MultiByteToWideChar, WideCharToMultiByte
Я так и делаю, но у меня англ. символы переводятся без проблем, а русские - знаками вопроса... Нужны, как на зло, именно русские символы...
Alex5
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
21.12.2013, 13:10 #18
BESSON_off, обратите внимание на первый параметр.

WideCharToMultiByte( code_page, ... ) : преобразуем куда: в code_page ( откуда: из wide char ).
MultiByteToWideChar( code_page, ... ), здесь наоборот, откуда: из code_page ( куда: to wide char ).

Пример. Преобразование из utf-8 в wide char:
C++
1
MultiByteToWideChar(CP_UTF8, ... );
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 344
21.12.2013, 13:40  [ТС] #19
Сейчас попробую...
Кстати, а почему незаписывается в поток информация в следующем примере:
C++
1
2
3
4
5
6
setlocale(LC_ALL,"");
std::wofstream wfout ("f:\\temp.txt");
if (!wfout)
return -1;
wfout<<L"Январь"; //Тут трабл
wfout.close();
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.12.2013, 13:57 #20
немного в сторону от темы:
бывает, что файлы маркируются спец образом (Byte order mark, BOM):
http://ru.wikipedia.org/wiki/%D0%9C%...82%D0%BE%D0%B2
Evg
21.12.2013, 14:05
  #21

Не по теме:

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

BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 344
21.12.2013, 14:58  [ТС] #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
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 344
21.12.2013, 15:02  [ТС] #23
Кстати, вот вложение
Вложения
Тип файла: txt Text.txt (1.9 Кб, 7 просмотров)
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
21.12.2013, 15:19 #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
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
21.12.2013, 15:34 #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
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
21.12.2013, 15:52 #26
Вероятно стоило изначально задать вопросы ТС:

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

А то так далеко можно пойти ...
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 344
21.12.2013, 19:23  [ТС] #27
Цитата Сообщение от Avazart Посмотреть сообщение
какой кодировке 1-я программа получает значения с сайта? В обще что сайт и что делает программа №1. ?
Первая программа скачивает страницу сайта. Далее парсит ее (достает нужные мне данные) и сохраняет найденные данные в файл. (тут программа сама создает файл в UTF-8 (без BOM), я бы предпочел ANSI).
Цитата Сообщение от Avazart Посмотреть сообщение
Что за таинственная программа №2?
Далее данные из этого файла подкачивают другие 2 программы, которые работают с этими данными. Но они не могут себе в контейнер string загрузить данные из этого файла, так как русский язык не распознается (английские символы проблем не создают).
Цитата Сообщение от Avazart Посмотреть сообщение
Какую среду разработки использует ТС?
MVS2012
Avazart
Эксперт С++
7151 / 5328 / 277
Регистрация: 10.12.2010
Сообщений: 23,578
Записей в блоге: 17
21.12.2013, 19:41 #28
BESSON_off,Не хочешь пояснять, так и быть решай сам свои проблемы.
MrGluck
Модератор
Эксперт CЭксперт С++
7210 / 4376 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
21.12.2013, 19:44 #29
Если необходимо работать с русскими символами, то
Цитата Сообщение от MrGluck Посмотреть сообщение
все должно быть юникодным. Кодировку советую UTF-8, все работы производить с std::wstring, std::wifstream, std::wofstream.
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 344
21.12.2013, 20:06  [ТС] #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();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2013, 20:06
Привет! Вот еще темы с ответами:

Построчное чтение файла с разными кодировками (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())...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.12.2013, 20:06
Ответ Создать тему
Опции темы

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