Кракозябры иероглифы ???? вместо русских букв C++ — Компьюпико.ком

Кракозябры иероглифы ???? вместо русских букв C++

Скомпилировали проект в Visual Studio и получили в консоли кракозябры, иероглифы, ???? вместо русских букв? Тогда эта статья будет вам полезна. В статье расскажем всё, ну или почти всё о том, что нужно делать в случае если компилятор Visual Studio не поддаётся ни на какие уговоры и пишет ???? вместо «Привет мир»!

Описание проблемы

В общем случае, проблема выглядит так: Вы написали или скопировали код программы на C++, программа использует стандартные инструменты ввода\вывода (cin count или чтение из файла f.read), хотитие вывести текст «Привет мир!», но вместо ожидаемого русского текста получаете кракозябры.

Рассмотрим два примера:

  1. Классический код С++, который выводит в консоль сообщение «Привет мир!»
#include <iostream>
#include <Windows.h>
using namespace std;

int main() {
  setlocale(LC_ALL, "Russian");
  cout << "Привет мир!" << endl;
  return 0;
}

C++ Visual Studio locale problem with russian language
На выходе получаем знаки вопроса ????? ????

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;
    }
}
C++ Visual Studio locale problem with russian language
На выходе так же получаем знаки вопроса или непонятные иероглифы

Причины

Прежде чем перейти к описанию возможных вариантов решения, давайте перечислим какие причины могут лежать в корне нашей проблемы. Мы выявили четыре основных причины:

  1. Кодировка терминала (так же известен как Command Prompt, Console, CMD)
  2. Языковые настройки Windows (Английская версия Windows)
    • Нет русского языка в системе
    • Русский не установлен по умолчанию
  3. Кодировка файла исходного кода
  4. Кодировка файла с данными

Решение

1. Кодировка терминала (так же известен как Command Prompt, Console, CMD)

Самая простая причина заключается в том, что в терминале(консоли) не выбран шрифт поддерживающий русские символы. Другими словами, с вашим кодом всё в порядке, просто в настройках вывода консоли выбран шрифт, который не содержит русских симоволов. Для решения этой проблемы необходимо просто выбрать другой шрифт в свойствах консоли как показано на рисунке ниже

Console Settings Windows
Выбор шрифта Lucida Console
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)

Language Settings Windows
Language Settings in Windows Server 2012

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

Set-WinSystemLocale -SystemLocale ru-RU

PowerShell locale settings
PowerShell change locale settings

После применения команды необходимо перезагрузить систему, чтобы настройки применились.

Если понадобится вернуть обратно по умолчанию английский, используйте аналогичную команду Set-WinSystemLocale -SystemLocale en-US

3. Кодировка файла исходного кода

Для того, чтобы после запуска программы язык в консоли соответствовал тому, что написано в редакторе кода Visual Studio, необходимо, чтобы файл исходного кода был сохранен в той же кодировке, в которой работает консоль. В стандартной ситуации, при исполнении классического кода вывода С++ приведенного ниже, необходимо чтобы файл исходного кода был сохранен в стандартной ANSI кодировке (выше мы уже выяснили, что для русской локали это кодировка Windows-1251)

setlocale(LC_ALL, "Russian");
cout << "Привет мир!"

Для того, чтобы сохранить файл исходного кода в этой кодировке, в Visual Studio нажмите Файл -> Sava As -> Save with Encoding

Save with encoding Visual Studio
Save with encoding Visual Studio

В открывшемся окне нужно выбрать кодировку Cyrillic (Windows) — Codepage 1251. Однако если вы не выполнили шаги из пункта 2 этой статьи, Visual Studio выдаст предпреждение о том, что не может сохранить русские символы в этой кодировке.

4. Кодировка файла исходного кода

Аналогично предыдущему пункту. Если вы хотите использовать классический код C++ для побайтового чтения текста из файла (пример кода приведен ниже), то на входе нужно иметь файл, также сохраненный в ANSI кодировке.

f.read((char*)&a, sizeof b);

Просто откройте блокнот, введите русский текст и сохраните файл в кодировке ANSI либо в кодировке Windows-1251(например, используя notepad++). Если сохранить не получается, проделайте шаги описанные в пункте 2 этой статьи.

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *