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

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

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

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

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

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

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

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

Как использовать русский язык в c. snimok1. Как использовать русский язык в c фото. Как использовать русский язык в c-snimok1. картинка Как использовать русский язык в c. картинка snimok1

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

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

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

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

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

Как использовать русский язык в c. snimok2. Как использовать русский язык в c фото. Как использовать русский язык в c-snimok2. картинка Как использовать русский язык в c. картинка snimok2

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

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

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

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

Как использовать русский язык в c. snimok3. Как использовать русский язык в c фото. Как использовать русский язык в c-snimok3. картинка Как использовать русский язык в c. картинка snimok3

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

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

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

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

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

Как использовать русский язык в c. snimok4. Как использовать русский язык в c фото. Как использовать русский язык в c-snimok4. картинка Как использовать русский язык в c. картинка snimok4

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

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

Как использовать русский язык в c. snimok5. Как использовать русский язык в c фото. Как использовать русский язык в c-snimok5. картинка Как использовать русский язык в c. картинка snimok5

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

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

Как использовать русский язык в c. snimok6. Как использовать русский язык в c фото. Как использовать русский язык в c-snimok6. картинка Как использовать русский язык в c. картинка snimok6

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

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

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

Как использовать русский язык в c. snimok7. Как использовать русский язык в c фото. Как использовать русский язык в c-snimok7. картинка Как использовать русский язык в c. картинка snimok7

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

Данный способ помог решить мне проблему с отображением русских символов в консоли Windows, надеюсь, что кому-нибудь еще он тоже поможет. Спасибо за внимание.

Для вас это может быть интересно:

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

Блин все делаю как показано но все равно не получается в свойствах консоли установлен шрифт Lucida Console может поможете)
Пишу:
#include
#include
#include

using namespace std;

int main()
<
setlocale(LC_ALL,»Russian»);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
cout

Проверил у себя — всё работает и отображает верно. Попробуйте набрать такую же программу, как на рисунке здесь http://nicknixer.ru/?p=349

Строчка setlocale(LC_ALL,»Russian») не нужна, без нее все работает.

В консоли 866 кодовая страница. Можно проще — Creator — Настройки — редактор — кодовая страница 866. Заработает самая первая программа.

Спасибо за 866 кодовую таблицу, все заработало.

Мучался 2 часа с выводом русских букв!
Перечитал кучу пустых советов.
Наконец-то.
Этот— самый толковый способ сделать так, чтобы все работало, и писало по русски!!
Благодарю Вас.

Я рад тому, что это помогло мне, Вам и другим людям.

Вижу, что не только в вебе проблема с отображением русских букв. PHP- программисты с вами!

Большое человеческое спасибо!
Очень помогли дельным советом. Всё работает как надо!

Спасибо!по полочкам и правильно всё разложено)

На мой взгляд, самый простой и действенный способ вывода русских букв в консоли Windows: писать исходники в ее родной кодировке, т. е. в OEM866 и проблем никаких не возникнет. Тем более, что почти все текстовые редакторы ее поддерживают. Для удобства можно установить эту кодировку по умолчанию в тот же Notepad++.
И не надо танцевать с бубном, подключать заголовки, использовать дополнительные функции, менять шрифты и т.д.

Спасибо, дай те бог здоровья!!

Благодарю за эти советы, они действующие, доходчивые. Ушла минута на то, что долго не мог сделать

Лайфхак от «Специалист»
После main
system(«chcp 1251 > nul»);

Имеется ввиду после фигурных скобок, т.е. в тело программы

Спасибо большое!Очень помогло.С начала про поток вывода узнал где то недели 2 назад, вчера заинтересовало почему поток ввода не работает. Менее минуты и вуаля. Надеюсь ругаться там не будет никто на счёт заголовочных файлов, но…ОС у всех разные, преобразователи (компиляторы) разные. Вот поэтому и советы для всех разные. Кому то кодировку сменить, а многим многим остальным дополнительные код надо писать. Может когда напишем собственную ОС(хотя кое что такое у нас было когда то давно) тогда ничего этого не надо будет. Автору статьи большое спасибо ещё раз. Русский язык стараюсь вписать куда угодно лишь бы было по русски. Надеюсь, это никого не задевает

Источник

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

Учу C++ по книжке Страуструпа, не выводятся русские символы. Вот код:

В Code::Blocks всё работает и без крякозяблов. Даже без setlocale.

Как использовать русский язык в c. Ew6lG. Как использовать русский язык в c фото. Как использовать русский язык в c-Ew6lG. картинка Как использовать русский язык в c. картинка Ew6lG

6 ответов 6

Для данной задачи существует множество решений. Если вам нужно быстрое и не обязательно универсальное решение, чтобы сильно не разбираться, прокручивайте к разделу «Менее правильные, но пригодные решения».

Правильное, но сложное решение

Для начала, проблема у консоли Windows состоит в том, что её шрифты, которые стоят «по умолчанию», показывают не все символы. Вам следует сменить шрифт консоли на юникодный, это позволит работать даже на английской Windows. Если вы хотите поменять шрифт только для вашей программы, в её консоли нажмите на иконку в левом верхнем углу → Свойства → Шрифт. Если хотите поменять для всех будущих программ, то же самое, только заходите в Умолчания, а не Свойства.

Дальнейшее рассмотрение касается лишь Microsoft Visual Studio. Если у вас другой компилятор, пользуйтесь предложенными на свой страх и риск, никакой гарантии нету.

Настроив среду, перейдём к решению собственно задачи.

(Ещё одна проблема, которую решает использование широких строк: узкие строки при компиляции кодируются в однобайтную кодировку используя текущую системную кодовую страницу, то есть, ANSI-кодировку. Если вы компилируете вашу программу на английской Windows, это приведёт к очевидным проблемам.)

Вам нужно _setmode(_fileno(. ), _O_U16TEXT); для переключения режима консоли:

Такой способ должен работать правильно с вводом и выводом, с именами файлов и перенаправлением потоков.

Если очень не хочется переходить на Unicode, и использовать однобайтную кодировку, будут возникать проблемы. Для начала, символы, не входящие в выбранную кодировку (например, для случая CP1251 — базовый английский и кириллица), работать не будут, вместо них будет вводиться и выводиться абракадабра. Кроме того, узкие строковые константы имеют ANSI-кодировку, а это значит, что кириллические строковые литералы на нерусской системе не сработают (в них будет зависимая от системной локали абракадабра). Держа в голове эти проблемы, переходим к изложению следующей серии решений.

Менее правильные, но пригодные решения

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

Убедитесь, что ваши исходники в кодировке CP 1251 (это не само собой разумеется, особенно если у вас не русская локаль Windows). Если при добавлении русских букв и сохранении Visual Studio ругается на то, что не может сохранить символы в нужной кодировке, выбирайте CP 1251.

(1) Если компьютер ваш, вы можете поменять кодовую страницу консольных программ на вашей системе. Для этого сделайте вот что:

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

(2) Вы можете поменять кодировку только вашей программы. Для этого нужно сменить кодировку консоли программным путём. Из вежливости к другим программам не забудьте потом вернуть кодировку на место!

Это делается либо при помощи вызова функций

в начале программы, либо про помощи вызова внешней утилиты

(То есть, у вас должно получиться что-то вроде

и дальше обыкновенный код программы.)

Можно обернуть эти вызовы в класс, чтобы воспользоваться плюшками автоматического управления временем жизни объектов C++.

(если выполняете задание из Страуструпа можно вставить в конец заголовочного файла std_lib_facilities.h )

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

Остались методы, которые тоже часто встречаются, приведём их для полноты.

Методы, которые работают плохо (но могут помочь вам)

Метод, который часто рекомендуют — использование конструкции setlocale(LC_ALL, «Russian»); У этого варианта (по крайней мере в Visual Studio 2012) гора проблем. Во-первых, проблема с вводом русского текста: введённый текст передаётся в программу неправильно! Нерусский текст (например, греческий) при этом вовсе не вводится с консоли. Ну и общие для всех неюникодных решений проблемы.

Поэтому стоит хранить исходники в Unicode (например, UTF-8).

Причем сохранить следует с сигнатурой

Ситуацию частично спасает пересохранение исходников в кодировке UTF-8 с обязательным символом BOM, без него Visual Studio начинает интерпретировать «широкие» строки с кириллицей весьма своеобразно. Однако, указав BOM (Byte Order Mark — метка порядка байтов) кодировки UTF-8 — символ, кодируемый тремя байтами 0xEF, 0xBB и 0xBF, мы получаем узнавание кодировки UTF-8 в любой системе

Стоит пояснить кое-что для тех, кто ищет правильный ответ по поводу функции setlocale:

Метод, который часто рекомендуют — использование конструкции setlocale(LC_ALL, «Russian»); У этого варианта (по крайней мере в Visual Studio 2012) гора проблем. Во-первых, проблема с вводом русского текста: введённый текст передаётся в программу неправильно! Нерусский текст (например, греческий) при этом вовсе не вводится с консоли. Ну и общие для всех неюникодных решений проблемы.

Я добавлю по этому методу побольше информации: Его вообще не правильно рекомендуют!

Начнём с первого: Во втором параметре функция принимает не название страны или языка, хотя в некоторых случаях она сработает, а языковый идентификатор, согласно ISO 3166-1. Поэтому правильно и корректно указывать: «ru-RU». Теперь второе: в документации к этой функции написано чёрным по белому: «If execution is allowed to continue, the function sets errno to EINVAL and returns NULL.» Что буквально толкуется: при возникновении ошибки, функция устанавливает значение переменной errno в EINVAL и возвращает NULL.

В случае возникновения ошибки, errno всегда будет равен EINVAL, что означает: не верный аргумент. Поэтому её проверять нет смысла, а вот исполнение функции должно быть проверено. Поэтому правильный вызов функции setlocale выглядит следующим образом:

И не забывайте, что setlocale устанавливает локальную таблицу только для ANSI кодировки, поэтому и не будут отображаться греческие, испанские, китайские и даже японские знаки. Для русского языка это будет таблица номер 1251.

И важно: почему эта функция является надёжней, нежели прямая установка таблицы символов через SetConsoleCP, ибо потому, что она переключает все внутренние надстройки именно для раскладки под язык. Начиная от стандарта отображения даты, заканчивая знаками разделителя.

И да, не стоит устанавливать языковый указатель виде «ru», так как в зависимости от сборки самой ось и имеющихся языковых пакетов, может установиться ru-BY, ru-UA, ru-MO и другие языковые стандарты, значительно отличающиеся от ru-RU. И категорично нельзя указывать «Russia», «Russian», «Russian Federation» (да, такую вакханалию уже встречал пару раз). Хотя функция производит проверку и по названию региона, не всегда в таблице локализации это указано, или может быть указано «Россия» или «Русский» уже на нашей раскладке. Это и есть основная ошибка, из-за которой функция setlocale зачастую отказывается работать.

И да, для приложения, работающего в режиме юникогда, стоит использовать функцию _wsetlocale. Она идентична, и также устанавливает базовые настройки для локализации. Кроме того, если проект приложения в Visual Studio настроен в режим юникода, то и будет работать только _wsetlocale, так как setlocale, по документации, не приспособлена к работе с юникодом вообще никак.

Совсем забыл указать, что функция setlocale и _wsetlocale, в случае успеха вернёт именно идентификатор региона. То есть, в нашем случае строку «ru_RU\0».

Источник

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode

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

На начальных этапах программирования многие новички сталкиваются с такой проблемой: они в коде пишут какое-либо сообщение на русском языке для консоли (например, используя printf), но при запуске программы вместо русских слов появляются какие-то непонятные знаки. Покажем, как избавиться от этой проблемы.

Например, при запуске вот этой программы:

В консоли будет отображено следующее:

Как использовать русский язык в c. 2015 02 15 13 27 42 Skrinshot e%60krana. Как использовать русский язык в c фото. Как использовать русский язык в c-2015 02 15 13 27 42 Skrinshot e%60krana. картинка Как использовать русский язык в c. картинка 2015 02 15 13 27 42 Skrinshot e%60krana

Всё дело в том, что мы не подключили русскую локализацию.

Исправить эту ошибку очень легко!

Для начала надо добавить следующую библиотеку:

Она отвечает за локализацию.

А затем нам надо просто написать в начале тела кода вот эту строку:

Функция setlocale задаёт локализацию программы. По умолчанию это только английский язык.
LC_ALL указывает программе, что локализированы будут все функции.

“Rus”, как легко догадаться говорит о том, что локализация произойдёт на русский язык.

Вот и всё! Мы включили русский язык в Си. Наша программа модернизирована и обогащена на две строки. Теперь она будет выглядеть вот так:

Как использовать русский язык в c. 2015 02 15 13 41 57 Skrinshot e%60krana. Как использовать русский язык в c фото. Как использовать русский язык в c-2015 02 15 13 41 57 Skrinshot e%60krana. картинка Как использовать русский язык в c. картинка 2015 02 15 13 41 57 Skrinshot e%60krana

Поделиться в соц. сетях:

15 комментария(ев) к статье “ Как включить русский язык в Си ”

Что именно? Какая ошибка?

Можете попробовать такой код:

#include
#include
#include

int main()
<
setlocale(LC_ALL, “Rus”);
printf(“Всем привет! Как дела?”);
getch(); //В Visual Studio _getch();
return 0;
>

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

Вместо одних каракулей появились другие. Но никаких ошибок не выдает.

Здравствуйте, Евгений. Существует ещё один способ включения русского языка в Си. Попробуйте использовать следующий код:

#include
#include
#include

int main()
<
SetConsoleCP(1251); //установка кодовой страницы win-cp 1251 в поток ввода
SetConsoleOutputCP(1251); //установка кодовой страницы win-cp 1251 в поток вывода
printf(“Всем привет! Как дела?”);
_getch();
return 0;
>

Здравствуйте, использовала такой метод как в статье.
Все работает при выводе текста функцией printf.
Но, когда я считываю слово функцией scanf, а потом вывожу его функцией printf появляются снова непонятные символы.
Подскажите пожалуйста как это можно исправить.

Здравствуйте! Чуть выше в комментариях приводятся ещё два способа, как включить русский язык в Си. Попробуйте их, должно сработать.

У меня та же проблема, с printf всё работает, но вот если ввести при scanf, то в выводе printf будут кракозябры

Попробуйте способы, указанные в комментариях выше. Один из них точно сработает.

Спасибо за инфу! Все работает.

Всё работает! Спасибо большое!

Правильно “Ru”, а не “Rus”.
setlocale(LC_ALL, “Ru”);

у меня получилось так:

#include
#include
#include

void main()
<
setlocale(LC_ALL, “Rus”);
wprintf(L”Спасибо”);
>

Если кто-то пишет в NotePad++ или чём-то подобном, не забудьте поменять кодировку самого файла с UTF-8 на, например, Windows-1251.
Спасибо за статью.

Источник

ЧаВо = Часто задаваемые Вопросы

по интегрированой среде Dev-C++

Список вопросов

Как настроить русский язык в консольных программах?

В консольных приложениях (похожих на текстовый режим) русские буквы выводятся к кодировке CP-866, а в оболочке Dev-C++ они набираются в кодировке CP-1251. Это значит, что вместо русских букв вы увидите «кракозябры». Чтобы этого не случилось, кодировку нужно исправить с помощью простой дополнительной программы. Сделайте следующее:

Как использовать русский язык в c. dcrus0. Как использовать русский язык в c фото. Как использовать русский язык в c-dcrus0. картинка Как использовать русский язык в c. картинка dcrus0

Как использовать русский язык в c. dcrus. Как использовать русский язык в c фото. Как использовать русский язык в c-dcrus. картинка Как использовать русский язык в c. картинка dcrus

Примечание от Ю. Проценко: Если программа при запуске не обнаруживает библиотеки libintl-8.dll и libiconv-2.dll, их нужно поместить в каталог C:\WINDOWS\SYSTEM32.

Как писать простые графические программы?

Для работы с графикой через браузер можно использовать онлайн-сервис Антона Деникина.

Для того чтобы на локальном компьютере подключить модуль для работы с графикой, сделайте следуюшее:

Как использовать русский язык в c. dcbgi. Как использовать русский язык в c фото. Как использовать русский язык в c-dcbgi. картинка Как использовать русский язык в c. картинка dcbgi

Как использовать русский язык в c. dceng. Как использовать русский язык в c фото. Как использовать русский язык в c-dceng. картинка Как использовать русский язык в c. картинка dceng

После выполнения этих действий вы можете использовать команды для рисования графических примитивов (отрезков, прямоугольников, окружностей и т.д.), так же, как раньше в Turbo C и Borland C++. Полное описание команд (на английском языке) можно найти на странице Михаэля Майна.

Вот так выглядит простейшая программа, которая выводит на экран отрезок из точки (0,0) (это левый верхний угол окна) в точку (50,50) и ждет нажатия на любую клавишу:

Как использовать русский язык в c. warn. Как использовать русский язык в c фото. Как использовать русский язык в c-warn. картинка Как использовать русский язык в c. картинка warnПрограммы, работающие с графикой в таком режиме, должны обрабатываться компилятором языка C++, для этого проще всего сделать у них расширение имени файла *.cpp.
Как использовать русский язык в c. warn. Как использовать русский язык в c фото. Как использовать русский язык в c-warn. картинка Как использовать русский язык в c. картинка warnВ программах, которые не работают с графикой, флажок Добавить эти команды к командной строке компоновщика нужно отключать, иначе при завершении программы будет появляться сообщение об ошибке.

Как работать с графикой в Windows 8/10?

Спасибо П.Ф. Муль, который прислал ссылку на эту инструкцию.

Проблема состоит в том, что устаревшая версия Bloodshed Dev-C++ 4.9.9.2 не работает в операционных системах Windows 8/10.

Полная инструкция по установке современной версии Dev-C++ и подключению модуля работы с графикой пожно посмотреть на видео How to Make Graphics in Dev C++ on Windows 10.

Для того, чтобы подключить модуль для работы с графикой в Windows 8/10, сделайте следуюшее:

Как использовать русский язык в c. dcbgiw10. Как использовать русский язык в c фото. Как использовать русский язык в c-dcbgiw10. картинка Как использовать русский язык в c. картинка dcbgiw10

Как использовать русский язык в c. dcengw10. Как использовать русский язык в c фото. Как использовать русский язык в c-dcengw10. картинка Как использовать русский язык в c. картинка dcengw10

Ещё одна инструкция по подключению простой графики от А. Ковалёва:

The following library directories don't exist:
C:\Program Files\Dev-Cpp\MinGW64\lib32

. \Dev-Cpp\MinGW64\lib
. \Dev-Cpp\MinGW64\lib32 (это ранее сделанная копия)
. \Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib
. \Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib32

Источник

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

Думаю, нет нужды говорить о том, что обучаться программированию имеет смысл на примерах с консольным интерфейсом. Не требующая специфических знаний в области GUI-библиотек, стандартизованная для всех операционных систем, имеющая встроенную поддержку в стандартных библиотеках большинства языков, консоль — идеальный вариант.

И C++ — не исключение. Поддержки графического интерфейса пользователя в стандартной библиотеке нет, и не предвидится ее включение из-за особенностей философии языка.

Часто возникающей проблемой с консольными программами (у русских программистов) является вывод кириллицы. Точнее его невозможность.

Отметим также, что проблема эта возникает исключительно у Windows-программистов. Имя проблеме — кодировки.

Если вы о них «что-то слышали, но что это такое — не уверены», очень советую прочитать эту статью.

Нет, правда, настоятельно советую.

Даже если нет времени — распечатайте и прочитайте в автобусе.

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

Дело в том, что в русскоязычных версиях Microsoft Windows в качестве основной кодировки принята ANSI, которая стандартизована одноименным комитетом, и для разных языков надстраивает ASCII-символы разными кодовыми страницами. Для нашего Отечества это cp1251. Консоль же Windows в противоположность использует устаревшую OEM-кодировку, на наречии Microsoft — кодовую страницу cp866. Зачем — Бог знает. Наверное, чтобы мы могли насладиться программами, написанными лет 20 назад, с красивыми окошками и кнопочками в стиле DOS.

Из-за несоответствия кодировок (т.е. способов интерпретации кодов символов в их графические представления) мы и видим на экране «╧ЁштхЄ!» вместо «Привет!».

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

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

Есть в Си волшебная функция

char* setlocale (int category, const char* locale)

Она устанавливает в программе т.н. локаль (locale) — набор национальных параметров, включающий помимо форматов даты, времени, валюты и т.п., характерных для данной местности, кодировку символов, в ней употребляемую.
Идентификатор локали — строка. Ее формат определяется по-разному. Рассмотрим различные варианты применительно к России.

1) В Win32API это число 1049. Логично, черт возьми.

Применительно к нам — «ru-RU».

3) В POSIX-системах (UNIX, GNU/Linux) используется стандартизованный формат

В нашем случае — «Russian_Russia.1251»

А кто сказал, что будет легко?

Вернемся к функции setlocale(). Первый параметр — целое число, в качестве передаваемого значения обычно используют константы, объявленные в и говорящие, какие категории нам надо локализовывать. Нам подойдет константа LC_CTYPE, которая влияет на функции, имеющие дело с символами.

Второй параметр функции — идентификатор локали. Туда можно передавать следующие значения:

1) Сокращение — «rus».

2) Название языка полностью — «Russian».

3) Номер кодовой страницы — «.1251».

Примечание: Если передать номер используемой в консоли OEM-кодировки («.866»), то символы в программе будут к ней преобразованы, что также является решением нашей проблемы. Этого же можно добиться, передав строку «.OCP», которая означает OEM Code Page и устанавливает локаль с текущей OEM-кодировкой операционной системы.

4) Идентификатор в формате POSIX — «Russian_Russia.1251»

5) Пустую строчку — «». Если мы так поступим, в программе будет установлена кодовая страница операционной системы по умолчанию, в нашем случае это соответствует cp1251.

Т.е. установка локали в простейшем случае производится следующим образом:

Источник

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

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