C# Чтение и запись русского текста из файлов
Необходимо создать программу, создающую корректный HTML_файл, содержащий весь текст из файла_с_текстом в котором помечены жирным и наклонным шрифтом все слова из файла_словаря. HTML_файл должен отображаться в любом Internet-браузере (IE, Firefox, Chrome и др.) корректно, показывая весь текст, с выделением указанных слов.
При чтении из файла в котором находится текст на русском языке и записи его в html программа некорректно считывает текст и заменяет его на на:
В то же время программа работает правильно, если текст на английском языке: 
С++: ввод/вывод для файлов, UTF-8
В учебнике Лафоре на стр.551-553 рассказано про форматированный вывод данных в файл, получение данных из файла.
Даются две небольшие программы. Первая выводит в файл символ, целое и вещественное числа, две строки и сообщает об окончании вывода (в консоль). Вторая — читает из созданного первой программой файла данные и выводит их на экран (в консоль).
Привычно (подробности — тут) переделываю эти программы вместо работы с обычными символами (char) для работы с широкими символами (wchar_t), чтобы можно было работать в программе с Юникодом (в том числе с русскими буквами). То есть тип char меняем на wchar_t, string на wstring, ofstream на wofstream, ifstream на wifstream, cout на wcout, символьные и строковые литералы предваряем префиксом L.
Кстати, чтобы смена cout на wcout сработала, в Windows требуется переключить стандартный поток вывода в формат Юникода (в Линуксе это делается по-другому) с помощью функции _setmode, которая требует подключения заголовочных файлов <io.h> и <fcntl.h>.
После этого (в тестовых целях) меняю выводимый латинский символ на русский, одну из двух выводимых строк с латиницы на русские буквы. Название файла меняю с «fdata.txt» на «файл с данными.txt», а сообщение в консоль меняю с «File written» на «Файл записан».
В результате сообщение на русском «Файл записан» в консоль вывелось успешно (это уже было отработано мной раньше), файл с названием русскими буквами «файл с данными.txt» создался успешно. Но, как только в выходной поток начинают поступать русские буквы, запись в файл не ведется, при этом никаких сообщений об ошибке не выдается.
Как оказалось, для вывода в файл (чтения из файла) широких символов недостаточно использования классов, работающих с широкими символами — wofstream и wifstream (я ожидал, что запись в файл будет произведена в кодировке UTF-16, исходя из того, что символы в Windows хранятся в кодировке UCS-2 (подмножество UTF-16), но этого не случилось).
Для правильного вывода русских букв в файл в данном случае требуется для текущей локали (объект соответствующего класса locale, содержащий набор параметров, определяющих региональные настройки) правильно настроить ее фасет класса codecvt (набор параметров локали поделен на отдельные разделы, называемые фасетами), регулирующий преобразование символов из одной кодировки в другую.
Раз уж итоговую кодировку текстового файла, в который будем записывать данные, всё равно нужно будет указывать, то выбираю кодировку UTF-8, как самую популярную на сегодня для текстовых файлов. Для этой кодировки имеется специальный фасет класса codecvt_utf8.
Для использования указанных классов в программу должны быть включены соответствующие заголовочные файлы <locale> и <codecvt>.
Итак, в начале функции main обеих программ создадим константу, содержащую локаль с нужным фасетом для преобразования символов при сохранении в файл в кодировке UTF-8:
А после создания объекта-потока нужного класса свяжем наш поток с определенной ранее локалью, воспользовавшись методом ios::imbue:
для второй программы:
После этого обе программы должны работать правильно, а информация будет храниться в текстовом файле в кодировке UTF-8.
Как прочитать на С++ Unicode файл с русским текстом?
Всем привет) Возникла задача читать Unicode файлы с содержимым на русском языке. Для решения задачи создал тестовый файл в Блокноте, заполнил его русским текстом и сохранил как Unicode. После пытался его прочитать следующими способами:
1)
Где-то в программе:
Данный способ выводит правильную длину строки s, но в консоль выводит кракозябры (вставить в начале setlocale пробовал)
2) Пытался использовать подход с использованием wstring и wchar_t при помощь wifstream. Эффекта ноль вообще (в консоль не выводится ничего).
3) Пытался использовать кодеры из codecvt следующим образом:
Эффекта опять же ноль. Проблем с чтением английского текста не возникало. Прошу помощи у знающих людей.