Русский язык в C++
Лучший способ совершенствовать навыки программирования на том или ином языке – это создание консольного программного обеспечения. Такие приложения обычно позволяют изучать особенности и нюансы функций, методов и классов.
C++ – известный язык разработки. Он является своеобразным стандартом, подходящим для самых разных целей. Именно поэтому далее предстоит более подробно изучить консольные приложения на C++.
Особое внимание в статье будет уделено вводу в консоль русского языка. Данная операция иногда может вызывать некоторые трудности. Наиболее распространенная ситуация – некорректное отображение кириллицы при вводе/выводе. Исправить положение обычно можно за счет грамотной разработки.
Особенности работы с вводом
Компьютеры и другие вычислительные машины умеют работать только с числами. Для представления букв или символов требуется воспользоваться так называемой кодировкой. Это алгоритм, согласно которому символ или буква получают определенное число-идентификатор. Подобное явление привело к образованию таблиц кодирования символов.
В разработке под Windows (не только на C++, но и на других языках программирования) чаще всего предстоит иметь дело с кодированными таблицами:
- UTF-8 (стандарт Unicode);
- cp1251;
- cp866.
Универсальной кодировочной таблицей служит Unicode, но это не меняет того, что в операционных системах допускается использование сразу нескольких кодировочных таблиц. Именно из-за них при работе той или иной программы на экране вместо нужных элементов появляются разнообразные нераспознаваемые символы.
В Windows кодировка символов соответствует стандарту cp866. Для русскоязычных операционных систем от Microsoft используется стандартная таблица cp1251 8-бит. При вводе текста в консоль через программу C++ происходит преобразование кириллицы в стандарт cp866. В этом случае некоторые элементы могут быть интерпретированы неправильно. Чтобы исправить ситуацию, нужно грамотно перекодировать его в стандарт cp866.
Функция setlocale
Локаль – это некий набор параметров:
- символы;
- страна;
- часовой пояс;
- язык пользователя;
- другие элементы.
Данный компонент в программном коде требуется для быстрой настройки пользовательского интерфейса в зависимости от географического положения.
C++ имеет функцию setlocale. Она используется для перекодировки символов в соответствие с требуемым языком. Данная функция определяется в заголовочном файле .
Функция setlocale имеет несколько параметров:
- тип категории локали;
- значение локали.
Для настройки русской консоли в C программе требуется воспользоваться локалью «rus». Вместо аргумента «rus» допускается написание «Russian» в рассматриваемой функции. Оставлять двойные кавычки пустыми допустимо, если символьный набор будет совпадать с параметрами имеющейся операционной системы.
Особенности Setlocale
Setlocale 0 rus – функция, которая задает локаль, используемую текущей программой. Она встречается в C и C++. Заголовочными файлами соответственно будут служить:
- locale.h – для Си;
- clocale – для C++.
Текущую локаль можно получить, передав через параметр locale значение NULL. Прототип функции имеет следующую форму:
- LC_ALL – вся локаль;
- lc_collate – оказывает влияние на strcoll и strfrm;
- lc_ctype – оказывает влияние на поведение всех команд заголовочного файла cctype за исключением isdigit и isxdigit;
- lc_monetary – денежный формат;
- lc_numeric – влияет на десятичную точку ввода/вывода и на команды форматирования строк;
- lc_time – изменяет поведение команды strftime.
Параметр locale включает в себя имя локали. Сюда можно передать минимум два значения: «C» – минимальную Си-локаль и » « – локаль по умолчанию, используемую средой разработки. Другие параметры тоже могут передаваться. Пример – для распознавания кириллицы.
Способы решения проблемы с вводом данных
Функция setlocale в C++ работает только для потока вывода. При использовании setlocale для ввода данных в консоль на экране появляются все те же непонятные символы. Вот пример работы приложения с вводом кириллицы. Здесь строка данных сохраняется в переменную, после чего выводится на консоль:
Выше можно заметить результат реализации фрагмента кода. Слово «Вывод» отобразилось корректно, а содержимое строки string – нет. Такое случилось из-за того, что setlocale работает только с потоком ввода.
Для исправления ситуации можно подключить заголовочный файл windows.h. В нем имеются прототипы функций SetConsoleCP и SetConsoleOutputCP. Они заменяют setlocale. Аргументом для рассматриваемых функций служит идентификатор кодовой страницы – win-cp 1251. SetConsoleCP используется для установки нужной таблицы на ввод (заменяет setlocale), SetConsoleOutputCP работает непосредственно с выводом.
У данного приема имеется один недостаток – указанные функции умеют работать только со шрифтом Lucida Console. По умолчанию в консоли установлен шрифт Consolas. Это приводит к тому, что в командной строке нужно предварительно настроить используемый тип шрифта. Для этого нужно:
- Открыть CMD в Windows.
- Перейти в «Свойства».
- Во вкладке «Шрифт» выбрать Lucida Console.
- Нажать на «Ок».
Если все сделано верно, кириллица будет работать корректно. Вот пример, в котором вместо setlocale используются предложенные ранее команды:
Ввод и вывод на кириллице в C++ настроены. Лучше разбираться в include locale.h и кодировках помогут специальные компьютерные курсы .
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode
Как включить русский язык в Си
На начальных этапах программирования многие новички сталкиваются с такой проблемой: они в коде пишут какое-либо сообщение на русском языке для консоли (например, используя printf), но при запуске программы вместо русских слов появляются какие-то непонятные знаки. Покажем, как избавиться от этой проблемы.
Например, при запуске вот этой программы:
#include «stdafx.h»
int _tmain ( int argc , _TCHAR* argv [ ] )
printf ( «Всем привет! Как дела?» ) ;
В консоли будет отображено следующее:

Всё дело в том, что мы не подключили русскую локализацию.
Исправить эту ошибку очень легко!
Для начала надо добавить следующую библиотеку:
Она отвечает за локализацию.
А затем нам надо просто написать в начале тела кода вот эту строку:
setlocale ( LC_ALL , «Rus» ) ;
Функция setlocale задаёт локализацию программы. По умолчанию это только английский язык.
LC_ALL указывает программе, что локализированы будут все функции.
«Rus», как легко догадаться говорит о том, что локализация произойдёт на русский язык.
Вот и всё! Мы включили русский язык в Си. Наша программа модернизирована и обогащена на две строки. Теперь она будет выглядеть вот так:
Русский язык в консоли

Чтобы консольное приложение Си корректно выводило русские символы, нужно выбрать locale по умолчанию.
- Подключить библиотеку locale.h #include
- В функции main() вызвать функцию setlocale(): setlocale(LC_ALL, «Russian»);
Для C++ аналогично:
- Подключить библиотеку clocale #include
- В функции main() вызвать функцию setlocale(): setlocale(LC_ALL, «Russian»);
Как подключить русский язык в c
При использовании кириллических символов мы можем столкнуться с ситуацией, когда вместо кириллических символов отображаются непонятные знаки. Особенно это актуально для ОС Windows. И в этом случае необходимо явным образом задать текущую локаль (культуру) для вывода символов. В Си это делается с помощью функции setlocale() , определение которой имеется в заголовочном файле locale.h .
Итак, изменим код, который использовался в прошлых темах следующим образом:
#include int main(void)
Компиляция и запуск в ОС Windows может выглядеть следующим образом:
c:\C>gcc hello.c -o hello & hello ╧ЁштхЄ ьшЁ! c:\C>
Вместо русских слов я получаю непонятные символы, и это не то, что ожидалось. Теперь изменим код, применив функцию setlocale:
#include #include int main(void)
Поскольку функция setlocale определена в файле locale.h, то он подключается с помощью директивы #include .
Повторно компилируем и запустим приложение:
c:\C>gcc hello.c -o hello & hello Привет мир! c:\C>
Стоит отметить, что в качестве кодировки текстового файла в этом случае должна использоваться кодировка ANSI или Windows-1251, но не UTF-8.
На некоторых платформах, например, Ubuntu/MacOS, мы можем не столкнуться с подобной проблемой. И в этом случае вызов функции setlocale просто не окажет никакого влияния.