C++
Setlocale russian c++: как вывести русский текст в C++ без кракозябр
Если в C++ вместо русского текста появляются непонятные символы, проблема почти всегда не в cout, а в кодировке исходного файла, локали программы или кодировке консоли. setlocale(LC_ALL, "") помогает программе взять системную локаль, но на Windows иногда дополнительно нужно переключить консоль на UTF-8
Для новых учебных проектов самый спокойный путь такой: сохраните файл в UTF-8, используйте современный терминал и не смешивайте русские строки в старой кодировке Windows-1251 с UTF-8
Минимальный пример с setlocale
Начните с такого кода:
#include <clocale>
#include <iostream>
int main() {
std::setlocale(LC_ALL, "");
std::cout << "Привет, C++!" << std::endl;
std::cout << "Русский текст выводится в консоль" << std::endl;
return 0;
}
Ожидаемый вывод:
Привет, C++!
Русский текст выводится в консоль
Если текст виден нормально, для вашей среды этого достаточно. Если вместо букв появились ???? или странные символы, переходите к проверкам ниже
Почему setlocale не всегда решает проблему
setlocale меняет локаль C/C++ runtime: правила для классификации символов, некоторых функций форматирования и обработки текста. Но консоль — отдельная часть системы. Она должна уметь правильно показать байты, которые ей отправила программа
Поэтому есть три места, где может сломаться русский текст:
- файл сохранен не в UTF-8;
- программа собрана или запущена в терминале со старой кодировкой;
- в Windows-консоли не совпадает code page.
Новичок часто пишет setlocale, но запускает программу в старой консоли, где включена другая кодировка. В итоге кажется, что setlocale не работает, хотя настоящая проблема в выводе терминала
Вариант для Windows с UTF-8
Если вы пишете под Windows и запускаете программу в консоли, можно явно задать UTF-8 для вывода:
#include <clocale>
#include <iostream>
#include <windows.h>
int main() {
SetConsoleOutputCP(CP_UTF8);
std::setlocale(LC_ALL, ".UTF-8");
std::cout << u8"Привет, C++!" << std::endl;
std::cout << u8"Проверяем русский текст" << std::endl;
return 0;
}
Если компилятор ругается на windows.h, значит вы собираете код не в Windows-среде или используете компилятор без Windows SDK. На macOS и Linux этот вариант не нужен
Как проверить кодировку файла
В VS Code откройте файл и посмотрите в правый нижний угол. Там обычно написано UTF-8, Windows 1251 или другая кодировка. Для учебных материалов по C++ лучше выбрать UTF-8
Если файл был в Windows-1251, пересохраните его в UTF-8 и соберите заново. Иногда кажется, что проблема в C++, а на деле файл уже содержит буквы в другой кодировке
Частые ошибки
Писать system(«chcp 1251») в каждый пример
Такой прием встречается в старых уроках, но он привязывает программу к Windows и к конкретной кодировке. Для учебы лучше понимать причину и работать с UTF-8
Ожидать, что setlocale переводит текст
setlocale ничего не переводит. Он не делает английский текст русским. Он только настраивает правила локали и помогает некоторым функциям работать с национальными настройками
Смешивать string и wstring без необходимости
Не надо сразу переписывать все на std::wstring, если вы просто выводите несколько русских строк в консоль. Сначала добейтесь нормального UTF-8 вывода
Самопроверка
Измените пример так, чтобы программа выводила имя и город:
#include <clocale>
#include <iostream>
int main() {
std::setlocale(LC_ALL, "");
std::cout << "Имя: Динар" << std::endl;
std::cout << "Город: Казань" << std::endl;
return 0;
}
Если обе строки читаются нормально, базовая настройка вывода работает
Что почитать дальше по C++
Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:
- Microsoft Visual C++ Runtime Library ошибка: как исправить без скачивания DLL
- sqrt C++: как посчитать квадратный корень и вывести результат
- Классы и ООП в C++: первый пример без перегруза
- Указатели в C++ без паники