Русские буквы в консоли Windows: непонятные символы вместо текста
Программа выводит Привет, а в окне консоли видно что-то вроде ╨Я╤А╨╕╨▓╨╡╤В. Программа при этом верна — не совпадают кодировки (способы записывать буквы байтами). Файл с программой сохранён в UTF-8, gcc оставляет строки в UTF-8, а консоль Windows с русским языком по умолчанию показывает текст в старой кодировке 866. Решение — переключить консоль на UTF-8.
Как переключить консоль на UTF-8
Выберите, где это сделать: командой в окне консоли (действует до закрытия окна) или в самой программе (действует при каждом запуске).
Командой в окнеchcp 65001
Перед запуском программы выполните в том же окне командной строки:
chcp 65001
hello.exechcp 65001 переключает окно на UTF-8 — до его закрытия. В новом окне команду нужно повторить.
Из программыSetConsoleOutputCP
Функция SetConsoleOutputCP из windows.h делает то же самое из самой программы. Чтобы программа собиралась и в Linux, где windows.h нет, вызов окружают проверкой #ifdef _WIN32 — в Windows этот код есть, в других системах его нет:
#include <stdio.h>
#ifdef _WIN32
#include <windows.h>
#endif
int main(void) {
#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif
printf("Привет, мир!\n");
return 0;
}Привет, мир!CP_UTF8 — номер кодировки UTF-8, то есть 65001. Способ работает и в окне, которое открывает Code::Blocks при запуске по F9.
Visual Studio: ключ /utf-8
Этот раздел — только для тех, кто собирает программу в Visual Studio; с gcc он не нужен.
Компилятор Visual Studio читает файл без особой отметки (BOM) в кодировке Windows — для русского языка это 1251, — и строки в программе тоже получаются в ней. Чтобы он читал файл и хранил строки в UTF-8, добавьте ключ /utf-8: в свойствах проекта откройте раздел «C/C++» → «Командная строка» и впишите /utf-8 в поле дополнительных параметров. Вместе с переключением консоли из программы (SetConsoleOutputCP) русский текст выводится правильно.
Если не помогло
- Файл сохранён не в UTF-8. Проверьте кодировку в редакторе: в VS Code она видна в строке состояния внизу окна (
UTF-8), там же её можно сменить командой «Сохранить с кодировкой». Если файл в Windows-1251, а консоль в UTF-8, непонятные символы останутся — только другие. - Шрифт без русских букв. В старых версиях Windows у консоли бывал точечный шрифт без кириллицы. В свойствах окна консоли выберите шрифт Consolas или Lucida Console.
- Ввод русских букв. Ввод текста на русском через
scanfиfgetsв консоли Windows работает хуже вывода: даже после переключения кодировки он ведёт себя по-разному в разных версиях Windows. Для учебных программ проще вводить латиницу и числа, а русский текст только выводить.
В Linux и macOS терминал работает в UTF-8, и русский текст выводится без всяких настроек.