Русские символы(буквы) при вводе/выводе в консоль на C++

При изучении языка C++ и программировании под Windows довольно часто возникают вопросы по поводу отображения русских букв в консоли. Вывод и ввод русских букв сопровождается выводом и вводом каких-то кракозябр или иероглифов. В интернете можно найти довольно много советов, но большая часть советов, которые мне попались, не помогали в решении проблемы.

Возникла проблема с отображением русских букв

Если нужно быстрое решение данной проблемы, то можно сразу пролистать вниз, ибо сначала я расскажу о том, как возникла эта проблема у меня и о том, как я искал решение.

На языке C++ программирую под ОС Linux, использую компилятор GCC. С проблемой неправильного отображения русских букв я не сталкивался. В момент написания статьи я нахожусь далеко от своего компьютера, могу довольствоваться лишь скромненьким ноутбуком с установленной ОС Windows Seven. Захотелось покодить и я установил на него интегрированную среду разработки Dev-C++ 5.10(использует компилятор TDM-GCC 4.8.1 на базе GCC 4.8.1). Кстати, она уже официально не поддерживается, но существует форк Orwell Dev-C++, который обновляется по сей день. Установив, я запустил и для пробы написал простую программку, которая отображает текст «Привет, мир!». Но поздороваться она с миром так и не смогла, а лишь сказала что-то непонятное на древнеегипетском. После перелопачивания некоторых форумов и сайтов я нашел множество советов, но основная масса не способна была решить её полностью, образовывались подводные камни о которых расскажу далее.

После написания, компиляции и запуска такой программы:

Можно получить примерно такой результат

Вывод кракозябр в консоль

Вывод кракозябр в консоль

Сразу понятно, что на приветствие это совсем не похоже.

После прочтения кучи советов стало понятно, что большая часть советов предлагала решить проблему функцией setlocale(), которая находится в заголовочном файле <clocale>.

Последовав совету и усовершенствовав программу таким образом:

Дополнительно: можно было написать setlocale(0, «») и результат был бы аналогичным, при условии, что в настройках ОС язык системы русский.

На вывод я получил следующий результат

Привет, Мир!

Привет, Мир!

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

О них я узнал из обсуждения. У человека была аналогичная проблема, решенная таким образом. Но решение удовлетворяло его недолго, он сообщил, что программа при вводе данных и последующем их выводе не выводит на руском, она говорит на непонятном языке.

Коль уж так, я решил вновь внести изменения в программу, пусть она поздоровается со мной по имени.

Но в результате я получил не приветствие

Оскорбление на древнеегипетском?

Оскорбление на древнеегипетском?

Как видно, она не смогла назвать моего имени.

Поискав информацию в сети, я узнал о том, что setlocale() не работает с потокоми ввода/вывода, а то есть с cin,cout,etc. Выходит, что нужно искать альтернативные способы решения данной проблемы, которые предлагались на других сайтах.

Решение проблемы с отображением русских букв в консоли

По-другому решить проблему можно было воспользовавшись функциями SetConsoleCP() и SetConsoleOutputCP() с аргуменом 1251 в обеих. Эти функции требуют подключения заголовка <Windows.h>, практически в каждом компиляторе под Windows он имеется, проблем не будет.

Усовершенствовал программу таким образом

На вывод получил

Вновь кракозябры в консоли

Вновь кракозябры в консоли

Снова что-то непонятное. Но решение, как оказалось, находилось очень близко. У функций SetConsoleCP() и SetConsoleOutputCP() есть небольшой недостаток — они работают только со шрифтом Lucida Console. В консоли же по умолчанию стоит шрифт Consolas, либо точечные шрифты. Следующим этапом сделать нужно вот что. Находясь в консоли нажать кнопку Cmd или нажать на значек программы в левом верхнем углу(Перед D:\… в названии), то есть вызвать контекстное меню окна. Далее нажать «Свойства».

Контекстное меню консоли

Контекстное меню консоли

Далее появится окно с настройками, там необходимо выбрать шрифт Lucida Console.

Свойства консоли Windows

Свойства консоли Windows

И нажать на кнопку ОК.

После такой процедуры я вновь запустил программу и…

Работа программы

Работа программы

Да! Она поздоровалась со мной по имени на русском языке.

Данный способ помог решить мне проблему с отображением русских символов в консоли Windows, надеюсь, что кому-нибудь еще он тоже поможет. Спасибо за внимание.

Русские символы(буквы) при вводе/выводе в консоль на C++: 19 комментариев

  1. Иван

    Блин все делаю как показано но все равно не получается в свойствах консоли установлен шрифт Lucida Console может поможете)
    Пишу:
    #include
    #include
    #include

    using namespace std;

    int main()
    {
    setlocale(LC_ALL,»Russian»);
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Привет, Мир!";
    return 0;
    }

  2. Taras Lavrov

    В консоли 866 кодовая страница. Можно проще — Creator — Настройки — редактор — кодовая страница 866. Заработает самая первая программа.

  3. Никита

    Спасибо за 866 кодовую таблицу, все заработало.

  4. Дмитрий

    Мучался 2 часа с выводом русских букв!
    Перечитал кучу пустых советов.
    Наконец-то!!!
    Этот— самый толковый способ сделать так, чтобы все работало, и писало по русски!!
    Благодарю Вас!!!

  5. Скейли

    Вижу, что не только в вебе проблема с отображением русских букв. PHP- программисты с вами!

  6. Наталья

    Большое человеческое спасибо!
    Очень помогли дельным советом. Всё работает как надо!

  7. Anastas

    На мой взгляд, самый простой и действенный способ вывода русских букв в консоли Windows: писать исходники в ее родной кодировке, т. е. в OEM866 и проблем никаких не возникнет. Тем более, что почти все текстовые редакторы ее поддерживают. Для удобства можно установить эту кодировку по умолчанию в тот же Notepad++.
    И не надо танцевать с бубном, подключать заголовки, использовать дополнительные функции, менять шрифты и т.д.

  8. Юрий

    Благодарю за эти советы, они действующие, доходчивые. Ушла минута на то, что долго не мог сделать

  9. Николай

    Лайфхак от «Специалист»
    После main
    system(«chcp 1251 > nul»);

    1. Николай

      Имеется ввиду после фигурных скобок, т.е. в тело программы

  10. Пакость

    Вообще-то setlocale() и всё вокруг неё касается преобразований WCHAR -> BYTE -> WCHAR у CRT функций (ну например если выводить тот-же самый «Привет мир» вот так:

    setlocale( LC_ALL, «.OCP» );
    wprintf(L»Привет мир!»);

    То будет уже профит.
    В свою очередь SetConsoleOutputCP() нужна примерно для того-же — на Винде с чужой кодировкой выводить юникодные строки кирилицей.
    ну а так Taras Lavrov верно указал как это для неюникодных программ делается.

  11. Алексей

    Спасибо большое!Очень помогло.С начала про поток вывода узнал где то недели 2 назад, вчера заинтересовало почему поток ввода не работает. Менее минуты и вуаля. Надеюсь ругаться там не будет никто на счёт заголовочных файлов, но…ОС у всех разные, преобразователи (компиляторы) разные. Вот поэтому и советы для всех разные. Кому то кодировку сменить, а многим многим остальным дополнительные код надо писать. Может когда напишем собственную ОС(хотя кое что такое у нас было когда то давно) тогда ничего этого не надо будет. Автору статьи большое спасибо ещё раз!!!Русский язык стараюсь вписать куда угодно лишь бы было по русски. Надеюсь, это никого не задевает

Добавить комментарий

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