Как написать программу на русском языке

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

И если это сообщение написано на латинице, то в командной строке Windows оно будет отображаться корректно. А если текстовое сообщение написано на кириллице, то вместо передаваемого сообщения, будет отображаться непонятная последовательность букв и символов (см. Рисунок 1). Реализуем программно то, что мы хотим сделать.

// rus_text.cpp: определяет точку входа для консольного приложения. #include «stdafx.h» #include using namespace std; int main(int argc, char* argv[]) < cout
// rus_text.cpp: определяет точку входа для консольного приложения. #include using namespace std; int main(int argc, char* argv[]) < cout

Программа передаёт сообщение Кириллица в консоли в командную строку Windows, и на этом завершает свою работу (см. Рисунок 1).

Можно ли написать программу на русском

CppStudio.com

╩шЁшыышЎр т ъюэёюыш Для продолжения нажмите любую клавишу . . .

Рисунок 1 — Кириллица в консоли

В результате, вместо передаваемого сообщения отображается непонятная последовательность символов, называемая — козяблики. Возникает вопрос: «Почему так происходит?». Чтобы понять природу происхождения так называемых козябликов, необходимо обратиться к теме — представление символов букв в компьютерах.

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

В связи с тем, что в мире существует более 2,5 тысяч языков, то для каждого алфавита создавались свои таблицы кодирования символов, вот почему существует большое количество таблиц кодирования символов. Так как мы программируем под Windows, то нас будут интересовать такие кодировочные таблицы: cp866, cp1251 и utf-8(стандарт Unicode). Хотя уже давно разработан единый стандарт кодирования символов — Unicode, в Windows до сих пор используются несколько кодировочных таблиц, а именно — cp866, cp1251. Использование нескольких таблиц кодирования символов и является причиной появления козябликов, вместо сообщения Кириллица в консоли .

Unicode — единый стандарт кодирования символов, позволяющий представить знаки всех письменных языков.

Таким образом стандарт Unicode присваивает каждому символу уникальный код, независимо от языка. Сейчас Unicode считается лучшим стандартом кодирования символов. Вернёмся к нашей проблеме — вывод кириллицы в консоль.

Читайте также:
Парус кадры программа описание

Так уж повелось, в командной строке Windows кодировка символов соответствует стандарту cp866. То есть все символы в командной строке Windows закодированы по кодировочной таблице cp866. Причём поменять кодировку в командной строке Windows нельзя. Просмотреть стандарт кодирования символов в консоли можно, с помощью команды GRAFTABL (см. Рисунок 2).

Как начать изучать программирование? С++, С#

Кириллица в консоли

Рисунок 2 — Кириллица в консоли

Во всех русскоязычных Windows кодировка cp1251 является стандартной 8 — битной кодировкой. И при создании проекта в MVS2010 этот стандарт кодирования символов наследуется проектом, то есть программой. Хотя кодировку для проекта в MVS2010 можно легко поменять, это не решает проблемы, так как консоль понимает только одну кодировку cp866, которой в MVS нет.

В итоге, получается, что программа передаёт коды символов сообщения стандарта cp1251. Командная строка принимает эти коды и переводит их в символы, но уже по стандарту cp866, так как другого стандарта не знает. В итоге сообщение передано в консоль, но символы интерпретированы не правильно, вот так и появляются козяблики.

Решить данную проблему можно только одним способом — перед тем, как передать текст в консоль, необходимо его перекодировать в стандарт кодирования символов cp866. Существует несколько способов преобразования кодов знаков из одного стандарта в другой, мы воспользуемся самым простым — настройка локали.

Локаль — это набор параметров: набор символов, язык пользователя, страна, часовой пояс и др. Локаль необходима для быстрой настройки пользовательского интерфейса, в зависимости от географического положения. В С++ есть функция setlocale() , которая выполняет перекодировку символов в соответствии с требуемым языком. Эта функция определена в заголовочном файле . Переделаем программу, которая передает сообщение Кириллица в консоли в командную строку windows.

// rus_text.cpp: определяет точку входа для консольного приложения. #include «stdafx.h» #include #include using namespace std; int main(int argc, char* argv[]) < setlocale(LC_CTYPE, «rus»); // вызов функции настройки локали cout

Источник: cppstudio.com

Как написать программу на русском языке

При использовании кириллических символов мы можем столкнуться с ситуацией, когда вместо кириллических символов отображаются непонятные знаки. Особенно это актуально для ОС Windows. И в этом случае необходимо явным образом задать текущую локаль (культуру) для вывода символов. В Си это делается с помощью функции setlocale() , определение которой имеется в заголовочном файле locale.h .

Итак, изменим код, который использовался в прошлых темах следующим образом:

#include int main(void)

Компиляция и запуск в ОС Windows может выглядеть следующим образом:

Читайте также:
Шрифт который используется в программах

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

Вместо русских слов я получаю непонятные символы, и это не то, что ожидалось. Теперь изменим код, применив функцию setlocale:

#include #include int main(void)

Поскольку функция setlocale определена в файле locale.h, то он подключается с помощью директивы #include .

Повторно компилируем и запустим приложение:

Кириллица в консоли в Си

Стоит отметить, что в качестве кодировки текстового файла в этом случае должна использоваться кодировка ANSI или Windows-1251, но не UTF-8.

На некоторых платформах, например, Ubuntu 16.04, мы можем не столкнуться с подобной проблемой. И в этом случае вызов функции setlocale просто не окажет никакого влияния.

Источник: metanit.com

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

Follow us on Twitter Follow us on rss

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

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

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

На языке C++ программирую под ОС Linux, использую компилятор GCC. С проблемой неправильного отображения русских букв я не сталкивался. В момент написания статьи я нахожусь далеко от своего компьютера, могу довольствоваться лишь скромненьким ноутбуком с установленной ОС Windows Seven.

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

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

#include using namespace std; int main()

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

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

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

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

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

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

Читайте также:
Определение программы обучения на пмпк

#include #include //Обязательно для функции setlocale() using namespace std; int main() < setlocale(LC_ALL,»Russian»); //Функция setlocale() с аргументами cout

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

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

Привет, Мир!

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

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

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

#include #include using namespace std; int main() < setlocale(LC_ALL,»Russian»); char name[12]; cout > name; //Ввод данных cout

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

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

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

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

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

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

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

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

#include #include // Обязательно для SetConsoleCP() и SetConsoleOutputCP() using namespace std; int main() < SetConsoleCP(1251); SetConsoleOutputCP(1251); char name[12]; cout > name; cout

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

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

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

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

Находясь в консоли нажать кнопку Cmd или нажать на значек программы в левом верхнем углу(Перед D:… в названии), то есть вызвать контекстное меню окна. Далее нажать «Свойства».

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

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

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

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

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

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

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

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

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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru