Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351

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

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

Студворк — интернет-сервис помощи студентам
Всем здрасти!

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

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

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

3) Как, при открытии файла, можно определить его кодировку, чтобы если она не ANSI, преобразовать её в таковую?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.12.2013, 17:56
Ответы с готовыми решениями:

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

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

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

41
Evg
21.12.2013, 14:05
Студворк — интернет-сервис помощи студентам

Не по теме:

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

0
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
21.12.2013, 14:58  [ТС]
Цитата Сообщение от 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 / 0
Регистрация: 08.07.2013
Сообщений: 351
21.12.2013, 15:02  [ТС]
Кстати, вот вложение
Вложения
Тип файла: txt Text.txt (1.9 Кб, 14 просмотров)
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.12.2013, 15:19
Если проект юникодный, то все должно быть юникодным. Кодировку советую 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-u... y3zcb.aspx

И последний вариант: iconv
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
21.12.2013, 15:34
Цитата Сообщение от 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
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.12.2013, 15:52
Вероятно стоило изначально задать вопросы ТС:

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

А то так далеко можно пойти ...
0
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
21.12.2013, 19:23  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
какой кодировке 1-я программа получает значения с сайта? В обще что сайт и что делает программа №1. ?
Первая программа скачивает страницу сайта. Далее парсит ее (достает нужные мне данные) и сохраняет найденные данные в файл. (тут программа сама создает файл в UTF-8 (без BOM), я бы предпочел ANSI).
Цитата Сообщение от Avazart Посмотреть сообщение
Что за таинственная программа №2?
Далее данные из этого файла подкачивают другие 2 программы, которые работают с этими данными. Но они не могут себе в контейнер string загрузить данные из этого файла, так как русский язык не распознается (английские символы проблем не создают).
Цитата Сообщение от Avazart Посмотреть сообщение
Какую среду разработки использует ТС?
MVS2012
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.12.2013, 19:41
BESSON_off,Не хочешь пояснять, так и быть решай сам свои проблемы.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.12.2013, 19:44
Если необходимо работать с русскими символами, то
Цитата Сообщение от MrGluck Посмотреть сообщение
все должно быть юникодным. Кодировку советую UTF-8, все работы производить с std::wstring, std::wifstream, std::wofstream.
0
 Аватар для BESSON_off
3 / 0 / 0
Регистрация: 08.07.2013
Сообщений: 351
21.12.2013, 20:06  [ТС]
Цитата Сообщение от 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
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.12.2013, 20:57
Цитата Сообщение от BESSON_off Посмотреть сообщение
Создается файл через ofstream и записываются в него данные через cURL. После данные (распарсенные/русский язык) сохраняются в файл. И этот файл читают в будущем другие программы, но они этого сделать не могут, так как файл сохраняется (почему-то) в кодировке UTF-8.
Как только curl запишет все данные и файл будет закрыт, откройте его,
считайте его содержимое в буфер, затем выполните MultiByteToWideChar(CP_UTF8, ...),
затем WideCharToMultiByte(CP_ACP, ...), - или, что еще лучше, с указанием точной
выходной кодировки, например 1251, если Вы ее знаете, - а затем сохраните обратно.
Правда, у юникода значительно больший диапазон, чем у ANSI-кодировок, поэтому
не удивляйтесь, если некоторые исходные символы будут потеряны.

Кстати, есть и другой, концептуально более правильный, способ -
попросить сервер сразу отдавать данные в нужной кодировке.
Например, в HTTP для этого есть заголовок "Accept-charset".
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
21.12.2013, 21:03
Цитата Сообщение от BESSON_off Посмотреть сообщение
wfout<<L"Январь"; //Тут трабл
что значит трабл?
Кодировка страницы исходника какая?
Выберите в студии дополнительные параметры сохранения и далее UTF-8 (там по умолчанию ANSI идет)
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.12.2013, 21:32
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, в HTTP для этого есть заголовок "Accept-charset".
Ну так сервер на это ответит своим charset : text/html; charset=windows-1251 и больше нечего ...
Миниатюры
Работа с кодировками файла (АНСИ и ЮТФ-8)  
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.12.2013, 21:44
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так сервер на это ответит своим charset : text/html; charset=windows-1251 и больше нечего.
Ну это не значит, что все серверы ведут себя так же.
В RFC 2616 (HTTP/1.1) сказано, что если сервер не может отдать контент в
запрашиваемой через accept-charset кодировке, ему следует вернуть код 406.
Хотя и отдать ответ в другой кодировке не возбраняется.
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.12.2013, 22:07
C https://www.google.com.ua та же штука...
Я по крайней мере не разу не видел что бы серв менял кодировку.

Добавлено через 4 минуты
Цитата Сообщение от BESSON_off Посмотреть сообщение
Я же все пояснил...
Что ты пояснил ? что там у тебя за программы? Какие из них твои какие других производителей ?
Документацию тех программ смотрел ?
Какой тип контента и с какого конкретно сайта скачивается ?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
22.12.2013, 01:33
Цитата Сообщение от Avazart Посмотреть сообщение
Что ты пояснил ? что там у тебя за программы? Какие из них твои какие других производителей ?
Документацию тех программ смотрел ?
Какой тип контента и с какого конкретно сайта скачивается ?
Переведу на русский язык. Ты выдал проблему в абстрактном виде. Тебе в абстрактном теоретическом виде объяснили, как её исправить. Но твоих знаний/навыков не хватает, чтобы понять абстрактное пояснение. Дальше либо ты предоставляешь исходники, либо разбираешься с проблемой сам, потому что конкретное решение тебе могут выдать только при конкретной постановке задачи: покажи конерктный сайт, покажи файл, который скачивается, покажи файл, который генерирует программа N1 и т.п. По другому вопрос зайдёт в тупик. Либо ты ещё раз перечитаешь то, что тут написали и попытаешься, наконец, вникнуть в написанное
1
 Аватар для gromo
383 / 281 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
22.12.2013, 01:48
http://local.joelonsoftware.co... 0%BE%D0%B2
Хорошую статью стоит прочитать интересующимся.
Многие вопросы отпадут и может кого-то осенит в решении проблемы. (сам не вникал во все посты)
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 01:52
Цитата Сообщение от 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();
Трабл в том, что в файл ничего на записывается.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21282 / 8307 / 637
Регистрация: 30.03.2009
Сообщений: 22,669
Записей в блоге: 30
22.12.2013, 01:53
Цитата Сообщение от alsav22 Посмотреть сообщение
У ТС есть вполне неабстрактный вопрос
"Тут трабл" - это ОЧЕНЬ абстрактная постановка проблемы
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 01:59
Цитата Сообщение от Evg Посмотреть сообщение
"Тут трабл" - это ОЧЕНЬ абстрактная постановка проблемы
Не понял. Это насчёт этого кода?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2013, 01:59

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

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

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

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

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


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

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

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru