Кирилиця в консолі, 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 <<"украинский текст. Да ладно!" <
return 0;
>