Как поставить русский язык в си
Перейти к содержимому

Как поставить русский язык в си

  • автор:

Русский язык в консоли C++

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

К примеру, если мы напишем такой код на С++

#include using namespace std; int main()

То после компиляции, вот что будет выдавать нам консольное окно программы.

Если же мы будем использовать функцию setlocale() внутри функции main()

#include using namespace std; int main()

То получим вместо иероглифов нормальный русский шрифт, вуаля:

Также, можно опустить последний аргумент функции — setlocale(LC_ALL, «Russian»); можно заменить на setlocale(0, «»); — работоспособность программы от этого не изменится.

Русский язык в 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. Прототип функции имеет следующую форму:

Русский язык в C++

  • LC_ALL – вся локаль;
  • lc_collate – оказывает влияние на strcoll и strfrm;
  • lc_ctype – оказывает влияние на поведение всех команд заголовочного файла cctype за исключением isdigit и isxdigit;
  • lc_monetary – денежный формат;
  • lc_numeric – влияет на десятичную точку ввода/вывода и на команды форматирования строк;
  • lc_time – изменяет поведение команды strftime.

Параметр locale включает в себя имя локали. Сюда можно передать минимум два значения: «C» – минимальную Си-локаль и » « – локаль по умолчанию, используемую средой разработки. Другие параметры тоже могут передаваться. Пример – для распознавания кириллицы.

Способы решения проблемы с вводом данных

Функция setlocale в C++ работает только для потока вывода. При использовании setlocale для ввода данных в консоль на экране появляются все те же непонятные символы. Вот пример работы приложения с вводом кириллицы. Здесь строка данных сохраняется в переменную, после чего выводится на консоль:

Русский язык в C++ Русский язык в C++

Выше можно заметить результат реализации фрагмента кода. Слово «Вывод» отобразилось корректно, а содержимое строки string – нет. Такое случилось из-за того, что setlocale работает только с потоком ввода.

Для исправления ситуации можно подключить заголовочный файл windows.h. В нем имеются прототипы функций SetConsoleCP и SetConsoleOutputCP. Они заменяют setlocale. Аргументом для рассматриваемых функций служит идентификатор кодовой страницы – win-cp 1251. SetConsoleCP используется для установки нужной таблицы на ввод (заменяет setlocale), SetConsoleOutputCP работает непосредственно с выводом.

У данного приема имеется один недостаток – указанные функции умеют работать только со шрифтом Lucida Console. По умолчанию в консоли установлен шрифт Consolas. Это приводит к тому, что в командной строке нужно предварительно настроить используемый тип шрифта. Для этого нужно:

  1. Открыть CMD в Windows.
  2. Перейти в «Свойства».
  3. Во вкладке «Шрифт» выбрать Lucida Console.
  4. Нажать на «Ок».

Если все сделано верно, кириллица будет работать корректно. Вот пример, в котором вместо setlocale используются предложенные ранее команды:

Русский язык в C++

Ввод и вывод на кириллице в C++ настроены. Лучше разбираться в include locale.h и кодировках помогут специальные компьютерные курсы .

Как включить русский язык в си?

Локализация работает на вывод через printf, но когда считываешь значения с файла выводится кракозябра. С английскими буквами все норм, как лечится?

Голосование за лучший ответ

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

DefПросветленный (35071) 1 год назад

У спрашивающего файл данных в левой кодировке

I MSN’sУченик (87) 1 год назад

поменял на A

I MSN’sУченик (87) 1 год назад

поменял на ANSI, заработало. Спасибо

> когда считываешь значения с файла выводится кракозябра

  1. Синхронизировать кодировку в файле данных и исходниках
  2. Если файл данных менять нельзя, то только гонять все строки из файла через перекодировщик.

Похожие вопросы

Как поставить русский язык в си

Есть альтернативное предложение: всю работу с консолью делать исключительно в 866 странице (Win OEM).

что это и как это?

п.с. лучше объясните мне кто нибудь почему не прокатывает setlocale? все лабы делал работало, а в курсовой никак где его еще написать? есть main, есть h-ник, есть модули с функциями, в одном из модулей лежит функция которая опрашивает у юзера данные для бд, в другом функция которая выводит эти (и другие) данные на экран, так вот эта вторая функция выводит крякозябры если писал на русском

Последний раз редактировалось NewLamer&Programer; 26.05.2013 в 07:20 .

NewLamer&Programer
Посмотреть профиль
Найти ещё сообщения от NewLamer&Programer

Форумчанин
Регистрация: 24.12.2012
Сообщений: 639

лучше объясните мне кто нибудь почему не прокатывает setlocale?

Потому что она действует не на все функции. например, на cout
ICQ: 677936656 Gmail: ekEmbed@gmail.com

Ezhik Kihze
Посмотреть профиль
Найти ещё сообщения от Ezhik Kihze

Форумчанин
Регистрация: 23.11.2012
Сообщений: 428
Ezhik Kihze, cout? это что то из C++? мы учим чистый Си, ничего из С++ не используется

NewLamer&Programer
Посмотреть профиль
Найти ещё сообщения от NewLamer&Programer

Регистрация: 08.04.2012
Сообщений: 3,229
Сообщение от NewLamer&Programer

что это и как это?

п.с. лучше объясните мне кто нибудь почему не прокатывает setlocale?

Этому есть, минмиум, две причины:
1. По чьему-то злому умыслу (вероятно, Майкрософт) для русского языка в Windows используются две различные кодировки — одна для оконных приложений, другая — для консольных. Иначе как диверсией я это назвать не могу, но факт остается фактом: ситуация, когда при правильно установленной локали на экране появляются кракозябры, была запланирована разработчиком.

2. Пусть у Вас есть файл с рассказом на английском языке. Как Вы думаете, достаточно ли установить русскую локаль, чтобы читать тот же файл на русском языке? Это к тому, что установка локали в принципе неспособнна решать некоторые проблемы.

все лабы делал работало, а в курсовой никак где его еще написать? есть main, есть h-ник, есть модули с функциями, в одном из модулей лежит функция которая опрашивает у юзера данные для бд, в другом функция которая выводит эти (и другие) данные на экран, так вот эта вторая функция выводит крякозябры если писал на русском

По сути дела ситуация такова:
— либо Вы делаете интерфейс на английском языке, либо Вам придется разбираться с кодировками и контролировать, в каком месте что Вы вводите и в какой именно кодировке.

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

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