Глиф Учебники

Русские буквы в консоли Windows: непонятные символы вместо текста

Справочник · C · 2 минуты чтения

Программа выводит Привет, а в окне консоли видно что-то вроде ╨Я╤А╨╕╨▓╨╡╤В. Программа при этом верна — не совпадают кодировки (способы записывать буквы байтами). Файл с программой сохранён в UTF-8, gcc оставляет строки в UTF-8, а консоль Windows с русским языком по умолчанию показывает текст в старой кодировке 866. Решение — переключить консоль на UTF-8.

Как переключить консоль на UTF-8

Выберите, где это сделать: командой в окне консоли (действует до закрытия окна) или в самой программе (действует при каждом запуске).

Командой в окнеchcp 65001

Перед запуском программы выполните в том же окне командной строки:

Командная строка
chcp 65001
hello.exe

chcp 65001 переключает окно на UTF-8 — до его закрытия. В новом окне команду нужно повторить.

Из программыSetConsoleOutputCP

Функция SetConsoleOutputCP из windows.h делает то же самое из самой программы. Чтобы программа собиралась и в Linux, где windows.h нет, вызов окружают проверкой #ifdef _WIN32 — в Windows этот код есть, в других системах его нет:

C
#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) русский текст выводится правильно.

Если не помогло

В Linux и macOS терминал работает в UTF-8, и русский текст выводится без всяких настроек.