Кирилиця в консолі, c для людей

Думаю, немає потреби говорити про те, що навчатися програмуванню має сенс на прикладах з консольним інтерфейсом. Що не вимагає специфічних знань в області 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. Логічно, чорт забирай.

2) В Java. NET і Windows починаючи з версії 6.0 ( «Vista») використовується більш стандартизований спосіб представлення локалі - рядок формату

Стосовно до нас - «ru-RU».

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

У нашому випадку - «Russian_Russia.1251»

А хто сказав, що буде легко?

Другий параметр функції - ідентифікатор локалі. Туди можна передавати такі значення:

1) Скорочення - «rus».

2) Назва мови повністю - «Russian».

3) Номер кодової сторінки - «.1251».

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

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

5) Порожню рядок - «». Якщо ми так вчинимо, в програмі буде встановлена ​​кодова сторінка операційної системи за умовчанням, в нашому випадку це відповідає cp1251.

Тобто установка локалі в найпростішому випадку проводиться таким чином:

using namespace std;

int main ()
<
setlocale (LC_CTYPE, "");
cout <<"украинский текст. Да ладно!" < cin.get ();
return 0;
>

Схожі статті