Скомпилировали проект в Visual Studio и получили в консоли кракозябры, иероглифы, ???? вместо русских букв? Тогда эта статья будет вам полезна. В статье расскажем всё, ну или почти всё о том, что нужно делать в случае если компилятор Visual Studio не поддаётся ни на какие уговоры и пишет ???? вместо «Привет мир»!
Описание проблемы
В общем случае, проблема выглядит так: Вы написали или скопировали код программы на C++, программа использует стандартные инструменты ввода\вывода (cin count или чтение из файла f.read), хотитие вывести текст «Привет мир!», но вместо ожидаемого русского текста получаете кракозябры.
Рассмотрим два примера:
- Классический код С++, который выводит в консоль сообщение «Привет мир!»
#include <iostream>
#include <Windows.h>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
cout << "Привет мир!" << endl;
return 0;
}

2. Код С++ для вывода в консоль информации прочитанной из файла
void outfile(fstream& f, int n)
{
Books b;
f.seekg(0);
cout << setw(7) << "шифр|" << setw(20) << "автор|"
<< setw(25) << "название|" << setw(5) << "год издания|"
<< setw(5) << "стеллаж|" << endl;
cout << setw(50) << "_________________________________" << endl;
for (int i = 0; i < n; i++)
{
f.read((char*)&a, sizeof b);
cout << setw(7) << a.number << "|" << setw(20)
<< a.author << "|" << setw(25) << a.name << "|" << setw(5)
<< a.year << "|" << setw(5) << a.location << "|";
cout << endl;
}
}

Причины
Прежде чем перейти к описанию возможных вариантов решения, давайте перечислим какие причины могут лежать в корне нашей проблемы. Мы выявили четыре основных причины:
- Кодировка терминала (так же известен как Command Prompt, Console, CMD)
- Языковые настройки Windows (Английская версия Windows)
- Нет русского языка в системе
- Русский не установлен по умолчанию
- Кодировка файла исходного кода
- Кодировка файла с данными
Решение
1. Кодировка терминала (так же известен как Command Prompt, Console, CMD)
Самая простая причина заключается в том, что в терминале(консоли) не выбран шрифт поддерживающий русские символы. Другими словами, с вашим кодом всё в порядке, просто в настройках вывода консоли выбран шрифт, который не содержит русских симоволов. Для решения этой проблемы необходимо просто выбрать другой шрифт в свойствах консоли как показано на рисунке ниже

2. Языковые настройки Windows (Английская версия Windows)
В этом случае простой сменой шрифта не обойтись. Прблемы должны возникнуть уже на этапе сохранения русского текста в обычном блокноте. Главный признак — при сохранении из блокнота невозможно сохранить русский текст в кодировке ANSI. Побочный признак — в Visual Studio русские символы сохраняются только если файл исходного кода программы сохранить в Unocode, а при попытке сохранить исходный код в кодировке Windows-1251 на выходе всё равно получаем нечитаемые символы, а после сохранения и открытия проекта наблюдаем эти же нечитаемые символы прямо в Visual Studio.
ℹ️ Для русской локали Windows ANSI-кодировкой обычно является Windows-1251, но в других локалях ANSI может означать другие кодировки (например, Windows-1252 для западноевропейских языков)
Всё вышесказанное указывает на то, что в нашей системе либо вообще не установлен русский язык либо язык установлен, но не применен в качестве языка по умолчанию.
Для решения этой проблемы:
Проверяем, что в системе установлен русский язык. Для этого в Windows переходим в языковые настройки (Control Panel\Clock, Language, and Region\Language) и проверяем наличие русского языкового пакета. Если вы видите только один язык, необходимо добавить русский (Add a language)

После того как вы убедились, что язык пристуствует, необходимо установить Русский язык стандартным языком системы. Для этого можно использовать удобные команды командной строки (CMD, PowerShell)
Set-WinSystemLocale -SystemLocale ru-RU

После применения команды необходимо перезагрузить систему, чтобы настройки применились.
Если понадобится вернуть обратно по умолчанию английский, используйте аналогичную команду Set-WinSystemLocale -SystemLocale en-US
3. Кодировка файла исходного кода
Для того, чтобы после запуска программы язык в консоли соответствовал тому, что написано в редакторе кода Visual Studio, необходимо, чтобы файл исходного кода был сохранен в той же кодировке, в которой работает консоль. В стандартной ситуации, при исполнении классического кода вывода С++ приведенного ниже, необходимо чтобы файл исходного кода был сохранен в стандартной ANSI кодировке (выше мы уже выяснили, что для русской локали это кодировка Windows-1251)
setlocale(LC_ALL, "Russian");
cout << "Привет мир!"
Для того, чтобы сохранить файл исходного кода в этой кодировке, в Visual Studio нажмите Файл -> Sava As -> Save with Encoding

В открывшемся окне нужно выбрать кодировку Cyrillic (Windows) — Codepage 1251. Однако если вы не выполнили шаги из пункта 2 этой статьи, Visual Studio выдаст предпреждение о том, что не может сохранить русские символы в этой кодировке.
4. Кодировка файла исходного кода
Аналогично предыдущему пункту. Если вы хотите использовать классический код C++ для побайтового чтения текста из файла (пример кода приведен ниже), то на входе нужно иметь файл, также сохраненный в ANSI кодировке.
f.read((char*)&a, sizeof b);
Просто откройте блокнот, введите русский текст и сохраните файл в кодировке ANSI либо в кодировке Windows-1251(например, используя notepad++). Если сохранить не получается, проделайте шаги описанные в пункте 2 этой статьи.