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

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

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

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

17.12.2013, 17:56. Просмотров 5172. Ответов 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
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
20.12.2013, 22:16 #16
Прочитать файл в буфер обычными байтовыми операциями, а дальше MultiByteToWideChar, WideCharToMultiByte
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 348
21.12.2013, 05:39  [ТС] #17
Цитата Сообщение от Evg Посмотреть сообщение
Прочитать файл в буфер обычными байтовыми операциями, а дальше MultiByteToWideChar, WideCharToMultiByte
Я так и делаю, но у меня англ. символы переводятся без проблем, а русские - знаками вопроса... Нужны, как на зло, именно русские символы...
0
Alex5
1056 / 720 / 108
Регистрация: 12.04.2010
Сообщений: 1,847
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, ... );
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 348
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();
0
DU
1483 / 1129 / 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
0
Evg
21.12.2013, 14:05
  #21

Не по теме:

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

0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 348
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();
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 348
21.12.2013, 15:02  [ТС] #23
Кстати, вот вложение
0
Вложения
Тип файла: txt Text.txt (1.9 Кб, 7 просмотров)
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,017
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
0
Evg
Эксперт CАвтор FAQ
17931 / 6155 / 408
Регистрация: 30.03.2009
Сообщений: 16,905
Записей в блоге: 27
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 (которое, в свою очередь, НЕ является кодировкой, а является ПРЕДСТАВЛЕНИЕМ данных)
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,790
Записей в блоге: 17
21.12.2013, 15:52 #26
Вероятно стоило изначально задать вопросы ТС:

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

А то так далеко можно пойти ...
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 348
21.12.2013, 19:23  [ТС] #27
Цитата Сообщение от Avazart Посмотреть сообщение
какой кодировке 1-я программа получает значения с сайта? В обще что сайт и что делает программа №1. ?
Первая программа скачивает страницу сайта. Далее парсит ее (достает нужные мне данные) и сохраняет найденные данные в файл. (тут программа сама создает файл в UTF-8 (без BOM), я бы предпочел ANSI).
Цитата Сообщение от Avazart Посмотреть сообщение
Что за таинственная программа №2?
Далее данные из этого файла подкачивают другие 2 программы, которые работают с этими данными. Но они не могут себе в контейнер string загрузить данные из этого файла, так как русский язык не распознается (английские символы проблем не создают).
Цитата Сообщение от Avazart Посмотреть сообщение
Какую среду разработки использует ТС?
MVS2012
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,790
Записей в блоге: 17
21.12.2013, 19:41 #28
BESSON_off,Не хочешь пояснять, так и быть решай сам свои проблемы.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,017
21.12.2013, 19:44 #29
Если необходимо работать с русскими символами, то
Цитата Сообщение от MrGluck Посмотреть сообщение
все должно быть юникодным. Кодировку советую UTF-8, все работы производить с std::wstring, std::wifstream, std::wofstream.
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 348
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();
0
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())...


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

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

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