Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 21.03.2022
Сообщений: 26

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

12.05.2022, 10:08. Показов 4776. Ответов 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
2893 / 2040 / 992
Регистрация: 21.12.2010
Сообщений: 3,790
Записей в блоге: 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 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru