Настройка отображения русских букв в консоли

Если мы сохраним файл с программой в кодировке windows-1251, то результат следующей инструкции:

std::cout << "Привет, мир!" << std::endl;

в окне консоли будет выглядеть так:

¦ЁштхЄ, ьшЁ!

Причина искажения русских букв заключается в том, что по умолчанию в окне консоли используется кодировка windows-866, а в программе мы ввели текст в кодировке windows-1251. Коды русских букв в этих кодировках отличаются, поэтому происходит искажение. При использовании командной строки пользователь может сменить кодировку вручную, выполнив команду:

chcp 1251

Однако этого недостаточно. Кроме смены кодировки необходимо изменить название шрифта, так как по умолчанию используются точечные шрифты, которые не поддерживают кодировку windows-1251. Для нормального отображения русских букв следует в свойствах окна выбрать шрифт Lucida Console (рис. 2.14). Все эти действия вы можете произвести на своем компьютере, однако пользователи не знают в какой кодировке выводятся данные в вашей программе.

Рис. 2.14. Указание шрифта Lucida Console в свойствах окна консоли

Изменить кодировку из программы мы можем с помощью функции system():

system("chcp 1251");

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

Консоль в Windows по умолчанию работает с кодировкой windows-866, поэтому мы можем и файл с программой сохранить в этой кодировке. При использовании редактора Notepad++ вначале создаем новый документ, а затем в меню Кодировки выбираем пункт Кодировки | Кириллица | ОЕМ 866. Вводим текст программы и сохраняем файл. В редакторе Eclipse кодировка задается в свойствах проекта.

Вроде все отлично, т. к. мы сохраняем файл в кодировке консоли по умолчанию:

C:\book>helloworld.exe
Привет, мир!

Однако пользователь может сменить кодировку в консоли и мы опять получим проблему с русскими буквами:

C:\book>chcp 1251
Текущая кодовая страница: 1251

C:\book>helloworld.exe
ЏаЁўҐв, ¬Ёа!

Кроме того, при сохранении файла с программой в кодировке windows-866 мы получим множество проблем при работе с файлами и каталогами.

Преобразование кодировки в Windows производится автоматически после настройки локали (локальных настроек компьютера). Настроить локаль позволяет функция setlocale(). Прототип функции:

#include <clocale> /* или #include <locale.h> */
char *setlocale(int category, const char *locale);

В первом параметре указывается категория в виде числа от 0 до 5. Вместо чисел можно использовать макроопределения LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC и LC_TIME. Во втором параметре задается название локали, после которого через точку указывается кодировка файла с программой (например, Russian_Russia.1251 или Russian_Russia.866).

Пример настройки локали и вывода русских букв приведен в листинге 2.15.

Листинг 2.15. Настройка локали

#include <iostream>
#include <clocale>

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

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

C:\book>chcp
Текущая кодовая страница: 866

C:\book>helloworld.exe
Привет, мир!

C:\book>chcp 1251
Текущая кодовая страница: 1251

C:\book>helloworld.exe
Привет, мир!

Однако, программа может быть запущена на компьютере, в котором кодировка консоли не позволяет отобразить русские буквы. Единственный способ полностью решить проблему с кодировками — выводить сообщения на английском языке. Коды латинских букв во всех однобайтовых кодировках одинаковые, поэтому при использовании английского языка проблем не будет. Однако тут существует другая сложность. Пользователь может не знать английского языка. Как видите не все так просто с кодировками при использовании консольных приложений.

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов