HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>Особенности работы с вводом</a></li>
1 <ul><li><a>Особенности работы с вводом</a></li>
2 <li><a>Функция setlocale</a><ul><li><a>Особенности Setlocale</a></li>
2 <li><a>Функция setlocale</a><ul><li><a>Особенности Setlocale</a></li>
3 </ul></li>
3 </ul></li>
4 <li><a>Способы решения проблемы с вводом данных</a></li>
4 <li><a>Способы решения проблемы с вводом данных</a></li>
5 </ul><p>Лучший способ совершенствовать навыки программирования на том или ином языке - это создание консольного программного обеспечения. Такие приложения обычно позволяют изучать особенности и нюансы функций, методов и классов.</p>
5 </ul><p>Лучший способ совершенствовать навыки программирования на том или ином языке - это создание консольного программного обеспечения. Такие приложения обычно позволяют изучать особенности и нюансы функций, методов и классов.</p>
6 <p><a>C++</a>- известный язык разработки. Он является своеобразным стандартом, подходящим для самых разных целей. Именно поэтому далее предстоит более подробно изучить консольные приложения на C++.</p>
6 <p><a>C++</a>- известный язык разработки. Он является своеобразным стандартом, подходящим для самых разных целей. Именно поэтому далее предстоит более подробно изучить консольные приложения на C++.</p>
7 <p>Особое внимание в статье будет уделено вводу в консоль русского языка. Данная операция иногда может вызывать некоторые трудности. Наиболее распространенная ситуация - некорректное отображение кириллицы при вводе/выводе. Исправить положение обычно можно за счет грамотной разработки.</p>
7 <p>Особое внимание в статье будет уделено вводу в консоль русского языка. Данная операция иногда может вызывать некоторые трудности. Наиболее распространенная ситуация - некорректное отображение кириллицы при вводе/выводе. Исправить положение обычно можно за счет грамотной разработки.</p>
8 <h2>Особенности работы с вводом</h2>
8 <h2>Особенности работы с вводом</h2>
9 <p>Компьютеры и другие вычислительные машины умеют работать только с числами. Для представления букв или символов требуется воспользоваться так называемой кодировкой. Это алгоритм, согласно которому символ или буква получают определенное число-идентификатор. Подобное явление привело к образованию таблиц кодирования символов.</p>
9 <p>Компьютеры и другие вычислительные машины умеют работать только с числами. Для представления букв или символов требуется воспользоваться так называемой кодировкой. Это алгоритм, согласно которому символ или буква получают определенное число-идентификатор. Подобное явление привело к образованию таблиц кодирования символов.</p>
10 <p>В разработке под Windows (не только на C++, но и на других языках программирования) чаще всего предстоит иметь дело с кодированными таблицами:</p>
10 <p>В разработке под Windows (не только на C++, но и на других языках программирования) чаще всего предстоит иметь дело с кодированными таблицами:</p>
11 <ul><li>UTF-8 (стандарт Unicode);</li>
11 <ul><li>UTF-8 (стандарт Unicode);</li>
12 <li>cp1251;</li>
12 <li>cp1251;</li>
13 <li>cp866.</li>
13 <li>cp866.</li>
14 </ul><p>Универсальной кодировочной таблицей служит Unicode, но это не меняет того, что в операционных системах допускается использование сразу нескольких кодировочных таблиц. Именно из-за них при работе той или иной программы на экране вместо нужных элементов появляются разнообразные нераспознаваемые символы.</p>
14 </ul><p>Универсальной кодировочной таблицей служит Unicode, но это не меняет того, что в операционных системах допускается использование сразу нескольких кодировочных таблиц. Именно из-за них при работе той или иной программы на экране вместо нужных элементов появляются разнообразные нераспознаваемые символы.</p>
15 <p>В Windows кодировка символов соответствует стандарту cp866. Для русскоязычных операционных систем от Microsoft используется стандартная таблица cp1251 8-бит. При вводе текста в консоль через программу C++ происходит преобразование кириллицы в стандарт cp866. В этом случае некоторые элементы могут быть интерпретированы неправильно. Чтобы исправить ситуацию, нужно грамотно перекодировать его в стандарт cp866.</p>
15 <p>В Windows кодировка символов соответствует стандарту cp866. Для русскоязычных операционных систем от Microsoft используется стандартная таблица cp1251 8-бит. При вводе текста в консоль через программу C++ происходит преобразование кириллицы в стандарт cp866. В этом случае некоторые элементы могут быть интерпретированы неправильно. Чтобы исправить ситуацию, нужно грамотно перекодировать его в стандарт cp866.</p>
16 <h2>Функция setlocale</h2>
16 <h2>Функция setlocale</h2>
17 <p>Локаль - это некий набор параметров:</p>
17 <p>Локаль - это некий набор параметров:</p>
18 <ul><li>символы;</li>
18 <ul><li>символы;</li>
19 <li>страна;</li>
19 <li>страна;</li>
20 <li>часовой пояс;</li>
20 <li>часовой пояс;</li>
21 <li>язык пользователя;</li>
21 <li>язык пользователя;</li>
22 <li>другие элементы.</li>
22 <li>другие элементы.</li>
23 </ul><p>Данный компонент в программном коде требуется для быстрой настройки пользовательского интерфейса в зависимости от географического положения.</p>
23 </ul><p>Данный компонент в программном коде требуется для быстрой настройки пользовательского интерфейса в зависимости от географического положения.</p>
24 <p>C++ имеет функцию setlocale. Она используется для перекодировки символов в соответствие с требуемым языком. Данная функция определяется в заголовочном файле &lt;clocale&gt;.</p>
24 <p>C++ имеет функцию setlocale. Она используется для перекодировки символов в соответствие с требуемым языком. Данная функция определяется в заголовочном файле &lt;clocale&gt;.</p>
25 <p>Функция setlocale имеет несколько параметров:</p>
25 <p>Функция setlocale имеет несколько параметров:</p>
26 <ul><li>тип категории локали;</li>
26 <ul><li>тип категории локали;</li>
27 <li>значение локали.</li>
27 <li>значение локали.</li>
28 </ul><p>Для настройки русской консоли в C программе требуется воспользоваться локалью "rus". Вместо аргумента "rus" допускается написание "Russian" в рассматриваемой функции. Оставлять двойные кавычки пустыми допустимо, если символьный набор будет совпадать с параметрами имеющейся операционной системы.</p>
28 </ul><p>Для настройки русской консоли в C программе требуется воспользоваться локалью "rus". Вместо аргумента "rus" допускается написание "Russian" в рассматриваемой функции. Оставлять двойные кавычки пустыми допустимо, если символьный набор будет совпадать с параметрами имеющейся операционной системы.</p>
29 <h3>Особенности Setlocale</h3>
29 <h3>Особенности Setlocale</h3>
30 <p>Setlocale 0 rus - функция, которая задает локаль, используемую текущей программой. Она встречается в C и C++. Заголовочными файлами соответственно будут служить:</p>
30 <p>Setlocale 0 rus - функция, которая задает локаль, используемую текущей программой. Она встречается в C и C++. Заголовочными файлами соответственно будут служить:</p>
31 <ul><li>locale.h - для Си;</li>
31 <ul><li>locale.h - для Си;</li>
32 <li>clocale - для C++.</li>
32 <li>clocale - для C++.</li>
33 </ul><p>Текущую локаль можно получить, передав через параметр locale значение NULL. Прототип функции имеет следующую форму:</p>
33 </ul><p>Текущую локаль можно получить, передав через параметр locale значение NULL. Прототип функции имеет следующую форму:</p>
34 <p>Параметры category:</p>
34 <p>Параметры category:</p>
35 <ul><li>LC_ALL - вся локаль;</li>
35 <ul><li>LC_ALL - вся локаль;</li>
36 <li>lc_collate - оказывает влияние на strcoll и strfrm;</li>
36 <li>lc_collate - оказывает влияние на strcoll и strfrm;</li>
37 <li>lc_ctype - оказывает влияние на поведение всех команд заголовочного файла cctype за исключением isdigit и isxdigit;</li>
37 <li>lc_ctype - оказывает влияние на поведение всех команд заголовочного файла cctype за исключением isdigit и isxdigit;</li>
38 <li>lc_monetary - денежный формат;</li>
38 <li>lc_monetary - денежный формат;</li>
39 <li>lc_numeric - влияет на десятичную точку ввода/вывода и на команды форматирования строк;</li>
39 <li>lc_numeric - влияет на десятичную точку ввода/вывода и на команды форматирования строк;</li>
40 <li>lc_time - изменяет поведение команды strftime.</li>
40 <li>lc_time - изменяет поведение команды strftime.</li>
41 </ul><p>Параметр locale включает в себя имя локали. Сюда можно передать минимум два значения: "C" - минимальную Си-локаль и " " - локаль по умолчанию, используемую средой разработки. Другие параметры тоже могут передаваться. Пример - для распознавания кириллицы.</p>
41 </ul><p>Параметр locale включает в себя имя локали. Сюда можно передать минимум два значения: "C" - минимальную Си-локаль и " " - локаль по умолчанию, используемую средой разработки. Другие параметры тоже могут передаваться. Пример - для распознавания кириллицы.</p>
42 <h2>Способы решения проблемы с вводом данных</h2>
42 <h2>Способы решения проблемы с вводом данных</h2>
43 <p>Функция setlocale в C++ работает только для потока вывода. При использовании setlocale для ввода данных в консоль на экране появляются все те же непонятные символы. Вот пример работы приложения с вводом кириллицы. Здесь строка данных сохраняется в переменную, после чего выводится на консоль:</p>
43 <p>Функция setlocale в C++ работает только для потока вывода. При использовании setlocale для ввода данных в консоль на экране появляются все те же непонятные символы. Вот пример работы приложения с вводом кириллицы. Здесь строка данных сохраняется в переменную, после чего выводится на консоль:</p>
44 <p>Выше можно заметить результат реализации фрагмента кода. Слово "Вывод" отобразилось корректно, а содержимое строки string - нет. Такое случилось из-за того, что setlocale работает только с потоком ввода.</p>
44 <p>Выше можно заметить результат реализации фрагмента кода. Слово "Вывод" отобразилось корректно, а содержимое строки string - нет. Такое случилось из-за того, что setlocale работает только с потоком ввода.</p>
45 <p>Для исправления ситуации можно подключить заголовочный файл windows.h. В нем имеются прототипы функций SetConsoleCP и SetConsoleOutputCP. Они заменяют setlocale. Аргументом для рассматриваемых функций служит идентификатор кодовой страницы - win-cp 1251. SetConsoleCP используется для установки нужной таблицы на ввод (заменяет setlocale), SetConsoleOutputCP работает непосредственно с выводом.</p>
45 <p>Для исправления ситуации можно подключить заголовочный файл windows.h. В нем имеются прототипы функций SetConsoleCP и SetConsoleOutputCP. Они заменяют setlocale. Аргументом для рассматриваемых функций служит идентификатор кодовой страницы - win-cp 1251. SetConsoleCP используется для установки нужной таблицы на ввод (заменяет setlocale), SetConsoleOutputCP работает непосредственно с выводом.</p>
46 <p>У данного приема имеется один недостаток - указанные функции умеют работать только со шрифтом Lucida Console. По умолчанию в консоли установлен шрифт Consolas. Это приводит к тому, что в командной строке нужно предварительно настроить используемый тип шрифта. Для этого нужно:</p>
46 <p>У данного приема имеется один недостаток - указанные функции умеют работать только со шрифтом Lucida Console. По умолчанию в консоли установлен шрифт Consolas. Это приводит к тому, что в командной строке нужно предварительно настроить используемый тип шрифта. Для этого нужно:</p>
47 <ol><li>Открыть CMD в Windows.</li>
47 <ol><li>Открыть CMD в Windows.</li>
48 <li>Перейти в "Свойства".</li>
48 <li>Перейти в "Свойства".</li>
49 <li>Во вкладке "Шрифт" выбрать Lucida Console.</li>
49 <li>Во вкладке "Шрифт" выбрать Lucida Console.</li>
50 <li>Нажать на "Ок".</li>
50 <li>Нажать на "Ок".</li>
51 </ol><p>Если все сделано верно, кириллица будет работать корректно. Вот пример, в котором вместо setlocale используются предложенные ранее команды:</p>
51 </ol><p>Если все сделано верно, кириллица будет работать корректно. Вот пример, в котором вместо setlocale используются предложенные ранее команды:</p>
52 <p>Ввод и вывод на кириллице в C++ настроены. Лучше разбираться в include locale.h и кодировках помогут<a>специальные компьютерные курсы</a>.</p>
52 <p>Ввод и вывод на кириллице в C++ настроены. Лучше разбираться в include locale.h и кодировках помогут<a>специальные компьютерные курсы</a>.</p>
53  
53