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

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

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

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

17.12.2013, 17:56. Просмотров 5010. Ответов 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#
Здравствуйте! Пишу программу, одна из задач - реализовать чтение файла с сервера. Использую следующий код: var text = new...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Убежденный
Системный программист
Эксперт С++
15506 / 7004 / 1106
Регистрация: 02.05.2013
Сообщений: 11,440
Завершенные тесты: 1
21.12.2013, 20:57 #31
Цитата Сообщение от BESSON_off Посмотреть сообщение
Создается файл через ofstream и записываются в него данные через cURL. После данные (распарсенные/русский язык) сохраняются в файл. И этот файл читают в будущем другие программы, но они этого сделать не могут, так как файл сохраняется (почему-то) в кодировке UTF-8.
Как только curl запишет все данные и файл будет закрыт, откройте его,
считайте его содержимое в буфер, затем выполните MultiByteToWideChar(CP_UTF8, ...),
затем WideCharToMultiByte(CP_ACP, ...), - или, что еще лучше, с указанием точной
выходной кодировки, например 1251, если Вы ее знаете, - а затем сохраните обратно.
Правда, у юникода значительно больший диапазон, чем у ANSI-кодировок, поэтому
не удивляйтесь, если некоторые исходные символы будут потеряны.

Кстати, есть и другой, концептуально более правильный, способ -
попросить сервер сразу отдавать данные в нужной кодировке.
Например, в HTTP для этого есть заголовок "Accept-charset".
MrGluck
Модератор
Эксперт CЭксперт С++
7209 / 4375 / 638
Регистрация: 29.11.2010
Сообщений: 11,887
21.12.2013, 21:03 #32
Цитата Сообщение от BESSON_off Посмотреть сообщение
wfout<<L"Январь"; //Тут трабл
что значит трабл?
Кодировка страницы исходника какая?
Выберите в студии дополнительные параметры сохранения и далее UTF-8 (там по умолчанию ANSI идет)
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
21.12.2013, 21:32 #33
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, в HTTP для этого есть заголовок "Accept-charset".
Ну так сервер на это ответит своим charset : text/html; charset=windows-1251 и больше нечего ...
Миниатюры
Работа с кодировками файла (АНСИ и ЮТФ-8)  
Убежденный
Системный программист
Эксперт С++
15506 / 7004 / 1106
Регистрация: 02.05.2013
Сообщений: 11,440
Завершенные тесты: 1
21.12.2013, 21:44 #34
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так сервер на это ответит своим charset : text/html; charset=windows-1251 и больше нечего.
Ну это не значит, что все серверы ведут себя так же.
В RFC 2616 (HTTP/1.1) сказано, что если сервер не может отдать контент в
запрашиваемой через accept-charset кодировке, ему следует вернуть код 406.
Хотя и отдать ответ в другой кодировке не возбраняется.
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
21.12.2013, 22:07 #35
C https://www.google.com.ua та же штука...
Я по крайней мере не разу не видел что бы серв менял кодировку.

Добавлено через 4 минуты
Цитата Сообщение от BESSON_off Посмотреть сообщение
Я же все пояснил...
Что ты пояснил ? что там у тебя за программы? Какие из них твои какие других производителей ?
Документацию тех программ смотрел ?
Какой тип контента и с какого конкретно сайта скачивается ?
Evg
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
22.12.2013, 01:33 #36
Цитата Сообщение от Avazart Посмотреть сообщение
Что ты пояснил ? что там у тебя за программы? Какие из них твои какие других производителей ?
Документацию тех программ смотрел ?
Какой тип контента и с какого конкретно сайта скачивается ?
Переведу на русский язык. Ты выдал проблему в абстрактном виде. Тебе в абстрактном теоретическом виде объяснили, как её исправить. Но твоих знаний/навыков не хватает, чтобы понять абстрактное пояснение. Дальше либо ты предоставляешь исходники, либо разбираешься с проблемой сам, потому что конкретное решение тебе могут выдать только при конкретной постановке задачи: покажи конерктный сайт, покажи файл, который скачивается, покажи файл, который генерирует программа N1 и т.п. По другому вопрос зайдёт в тупик. Либо ты ещё раз перечитаешь то, что тут написали и попытаешься, наконец, вникнуть в написанное
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
22.12.2013, 01:48 #37
http://local.joelonsoftware.com/wiki...BB%D0%BE%D0%B2
Хорошую статью стоит прочитать интересующимся.
Многие вопросы отпадут и может кого-то осенит в решении проблемы. (сам не вникал во все посты)
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 01:52 #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
Эксперт CАвтор FAQ
17621 / 5845 / 375
Регистрация: 30.03.2009
Сообщений: 16,118
Записей в блоге: 26
22.12.2013, 01:53 #39
Цитата Сообщение от alsav22 Посмотреть сообщение
У ТС есть вполне неабстрактный вопрос
"Тут трабл" - это ОЧЕНЬ абстрактная постановка проблемы
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 01:59 #40
Цитата Сообщение от Evg Посмотреть сообщение
"Тут трабл" - это ОЧЕНЬ абстрактная постановка проблемы
Не понял. Это насчёт этого кода?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 05:10 #41
Так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    //setlocale(LC_ALL, "");
   
   wofstream wfout ("temp.txt");
   wfout.imbue(locale("rus_rus.866"));
   
   wstring ws = L"Январь";
   wfout << ws;
   wfout.close();
    
   wifstream wfin("temp.txt");
   if (!wfin) cout << "Error!" << endl;
   else
   {
        wfin.imbue(locale("rus_rus.866"));
        wstring wstr;
        wfin >> wstr;
        wcout.imbue(locale("rus_rus.866"));
        wcout << wstr << endl;
        wcout << L"Русский текст" << endl;
   }
Или так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    setlocale(LC_ALL, "");
   
   wofstream wfout ("temp.txt");
   wfout.imbue(locale("rus_rus.1251"));
   
   wstring ws = L"Январь";
   wfout << ws;
   wfout.close();
    
   wifstream wfin("temp.txt");
   if (!wfin) cout << "Error!" << endl;
   else
   {
        wfin.imbue(locale("rus_rus.1251"));
        wstring wstr;
        wfin >> wstr;
        //wcout.imbue(locale("rus_rus.1251"));
        wcout << wstr << endl;
        wcout << L"Русский текст" << endl;
   }
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 344
25.12.2013, 16:04  [ТС] #42
Парни, всем спасибо, разобрался!
Проблема оказалась вот в чем (для будущих соискателей способов конвертации символов UTF-8 в ANSI и обратно) - дело в том, что я не понимал самой сути функций WideCharToMultiByte и MultiByteToWideChar. Я думал, что кодировка UTF-8 - это уже и есть готовые широкие символы, которые для использования через ANSI, нужно просто конвертировать, поэтому дело не шло. Оказалось, что эти две функции, это некое среднее между ANSI и UTF, то есть для того, чтобы перевести любую кодировку в ту, которая необходима нужно сначала перевести строку символов в широкие символы и дальше уже приводить к той кодировке, которая необходима... Все дело было в логике =) Функции отлично работают.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2013, 16:04
Привет! Вот еще темы с ответами:

Вывод в браузер сгенерированных изображений при кодировке скрипта ютф-8 - PHP
Допустим, я генерирую в php-скрипте какое-то изображение с помощью GD и вывожу его в браузер, например, так: header('Content-Type:...

Как поменять кодировку в файле на ютф-8 если в редакторе уже стоит такая - PHP
Как поменять кодировку в файле на ютф-8 если в редакторе уже стоит такая уже -- и в индекс файле все отображается нормальными русскими...

Сохранил *.PAS файл в формате юникода, как вернуть пас файл в анси - Delphi
я пытался китайский добавить в свою программу и случайно сохранил пас файл (или же внутренний файл для компиляции в формате юникода),...

функция которая переводит текст в русского на транслит не работает с кодировкой ЮТФ-8, я при windows1251 всё впорядке - PHP
Данная функция которая переводит текст в русского на транслит не работает с кодировкой ЮТФ-8, я при windows125 всё впорядке, кто-то может...


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

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

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