0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26

С++ fstream чтение файла в кодировке utf-8 и вывод в консоль

12.05.2022, 10:08. Показов 4703. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Столкнулся с проблемой что не могу считать файл с кодировкой UTF-8.
При обычном чтении файла ifstream читает в кодировке ANSI. Я нашел на форуме строки кода с locale.



Вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>
#include <iostream>
#include <string>
#include <fstream>
#include <locale>
#include <codecvt>
using namespace std;
 
/*
 * 
 */
int main(int argc, char** argv) {
    setlocale(LC_ALL, "Rus");
    locale utf8_to_utf16(locale(), new codecvt_utf8<wchar_t>);
    wifstream file("newfile.txt");
    file.imbue(utf8_to_utf16);
    if(!file)
        return 1;
    wstring wstr;
    file >> wstr;
    wcout << L"АБВ = " << wstr;
    return 0;
}
Текстовый файл newfile.txt содержит 3 русские буквы "абв".
И у меня не выводит текст из файла.
Помогите пожалуйста. В чем у меня ошибка?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2022, 10:08
Ответы с готовыми решениями:

Чтение файла в кодировке utf-8 и вывод в консоль
Здорова! Пытаюсь прочитать файл в кодировке utf-8 (вот он ) и вывожу его в консоль, ничего не получается. Вот код: #include...

Чтение файла в кодировке UTF-8 InputStreamReader
Добрый день. Мне необходимо прочитать текстовый файл в кодировке UTF-8 построчно. Написал программу, которая должна вывести на...

Чтение .txt файла, сохраненного в кодировке UTF-8
Привет всем! Есть .txt файл, в котором записаны 4 символа: ӮӰӴӸԊ. Файл сохранен в кодировке UTF-8. При чтении из этого файла, получается...

7
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
12.05.2022, 19:38  [ТС]
Ну мне нужно считать из файла newfile.txt - 3 символа (абв) и вывести их в консоль. кодировка в файле newfile.txt - UTF-8.

Как я могу считать эти буквы и вывести их в консоль?
0
 Аватар для igorrr37
2878 / 2025 / 991
Регистрация: 21.12.2010
Сообщений: 3,763
Записей в блоге: 9
18.05.2022, 15:42
если шрифт консоли поставить courier new то вот так работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <cstdlib>
 
int main() 
{
    system("chcp 65001 > 0");
    std::ifstream ifs{ "utf8.txt" };
    if (ifs.is_open())
    {
        std::string str{ std::istreambuf_iterator<char>{ ifs.rdbuf()}, {} };
        std::cout << str << "\n";
    }
    else
    {
        std::cerr << "Unable to open file\n";
    }
}
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
18.05.2022, 15:56  [ТС]
Да, так у меня работает. А как сделать тоже самое для многобайтовой системы (wchar_t)?

Добавлено через 6 минут
Я сейчас нашел файл про locale: https://docs.yandex.ru/docs/vi... odt&nosw=1
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
24.05.2022, 18:25
Лучший ответ Сообщение было отмечено Antohych как решение

Решение

Не используйте манипуляции с локалью.
Для вывода текста на консоль есть функция WriteConsoleW.
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
25.05.2022, 16:05  [ТС]
Замабувараев, Спасибо большое. Но я только не понял, почему не получается с wcout?

Добавлено через 3 минуты
без использования locale ничего не получается.

Добавлено через 6 минут
Я совсем не понимаю, почему не работает с wcout?

Добавлено через 15 минут
Вот мой код. Я считываю по одному символу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <locale>
#include <codecvt>
#include <windows.h>
using namespace std;
 
int main() {
    setlocale(LC_ALL, "rus");
 
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
 
    wstring wstr = L"";
 
    std::locale utf8_to_utf16(std::locale(), new std::codecvt_utf8<wchar_t>);
    wfstream fst;
    fst.imbue(utf8_to_utf16);
    fst.open("newfile.txt", ios::in);
    if (fst.is_open()) {
        cout << "begin\n";
        wchar_t ch;
        while (fst.eof() == 0) {
            ch = fst.get();
            if (fst.eof() == 1)
                break;
            wstr += ch;
        }
        WriteConsoleW(hConsole, &wstr[0], wstr.size(), NULL, NULL);
        cout << "\nend";
        fst.close();
    }
    return 0;
}
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
25.05.2022, 18:32
Юникод в виндоуз — это всегда UTF-16. Можете хранить строки как угодно, хоть в UTF-8, хоть в 866. Но чтобы вывести юникод — вам придётся иметь UTF-16 строку. Я не знаю почему разработчики таких штук как wcout до сих пор не могут это понять, и упорно делают неправильно, выводя UTF-8 в консоль. Уточняйте у разработчиков этих библиотек.

В то же время консольные функции операционной системы (WriteConsoleW и ReadConsoleW) прекрасно работают с юникодными строками. Манипуляции с локалью, с system("chcp 1251") и прочее извращение для их работы не требуется.
0
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26
25.05.2022, 18:46  [ТС]
Замабувараев, Спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2022, 18:46
Помогаю со студенческими работами здесь

Sed: не выводится в консоль stdout в кодировке UTF-8
Здравствуйте! Имеется текст, содержащий символы Unicode. Вывожу из буфера на консоль утилитой paste.exe с...

Java выдает в консоль результат в кодировке UTF-8. Что делать?
Уж извините, на форуме нигде раздела BAT не нашел, пишу сюда! Модераторы, переместите, если нужно. Проблема просто выше моего уровня (...

Чтение файлов формата .txt в кодировке utf-8
Уважаемые форумчане! Делаю скрипт для чтения и записи txt-файлов из Excel-вского файла по средствам VBA макросов. Но всё упёрлось в...

Чтение файла (с кракозябрами) с однобайтовой кодировкой, конвертация в UTF-8 и вывод в другой файл
Добрый день, форумчане. Может у кого есть заготовка или кто поделится советом, необходимо прочитать файл (с кракозябрами) с однобайтовой...

Чтение из текстового файла и вывод в консоль
Помогите пожалуйста, мне нужно чтобы из текстового файла в консоли выводился список людей, например 1 Иванов Иван Васильевич 2 Иванов...


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

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

Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru