Chirilic pe consola, c pentru oameni

Cred că e nevoie să spun că este logic să învețe programare pe exemplele consola de interfață. Ea nu are nevoie de cunoștințe specifice în domeniul GUI-biblioteci, standardizate pentru toate sistemele de operare, care a construit-in-suport în biblioteca standard cele mai multe limbi, consola - o optiune ideala.

Și C ++ - nu este o excepție. Sprijin pentru o interfață grafică cu utilizatorul în biblioteca standard nu este, și nu este de așteptat includerea sa particularitatilor filosofia limbajului.

De multe ori există o problemă cu programele de consola (in programatori din Romania) este ieșirea alfabetului chirilic. Mai degrabă imposibilitatea acesteia.

Rețineți, de asemenea, că această problemă apare numai în Windows-programatori. Nume problema - codificare.

Dacă ești dintre ei „Am auzit ceva, dar ceea ce este - nu sunt sigur“, va recomand cu tărie să citiți acest articol.

Nu, într-adevăr, se recomandă insistent.

Chiar dacă nu există nici un timp - de imprimare și citiți în autobuz.

Dar mai mult, până la punctul.

Faptul că versiunea în limba rusă a Microsoft Windows ca codificarea primară a adoptat ANSI, care este Comitetul omonim standardizat și pentru diferite limbi se bazează pe ASCII de caractere în diferite pagini de cod. Pentru patria noastră este cp1251. Consola utilizează, de asemenea, pentru Windows, spre deosebire de neactualizat OEM-codare pe dialectul Microsoft - codul paginii cp866. De ce - Dumnezeu știe. Probabil, astfel încât să putem bucura de programe scrise acum 20 de ani, cu ferestre frumoase și butoane de stil DOS.

Datorită incoerența codificări (de exemplu, modalități de interpretare coduri de caractere în reprezentările grafice ale acestora) pe care le vedem pe ecran „╧OshthЄ!“ În loc de „Bună ziua!“.

Dacă există ceva ce nu înțeleg de explicația anterioară, este încă recomandat pentru a citi articolul la link-ul de mai sus, ca aici - doar o scurtă descriere a problemei și contextul istoric și stabilirea unor relații cauzale - un material atât de mare încât să duplicat, eu nu văd rostul.

În schimb, aș dori să ia în considerare câteva moduri de a rezolva această problemă. Mai precis, considerăm o metodă, iar restul voi oferi link-uri.

Există o funcție magică C

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

Acesta stabilește așa-numitul program de locale (locale) - un set de parametri naționali, inclusiv formate în plus față de data, ora, moneda, etc. tipic pentru zona, codificarea caracterelor este utilizat în ea.
Locale identificator - un șir de caractere. Formatul său este definit în diferite moduri. Luați în considerare diferitele exemple de realizare, cu referire la România.

1) În Win32API numărul 1049. Este rezonabil în iad.

2) În Java. NET și Windows de la versiunea 6.0 ( «Vista») a folosit un mod standardizat de reprezentare a locale - șirul de format

În ceea ce privește noi - «ru-RU».

3) La sistemele POSIX (UNIX, GNU / Linux), folosind un format standardizat

În cazul nostru - «Russian_Russia.1251»

Și cine a spus că va fi ușor?

Al doilea parametru funcție - identificatorul localizare. Acolo puteți transfera următoarele valori:

1) Cut - «rus».

2) numele limbii complet - «rusă».

3) numărul paginii de cod - „0.1251.“

Notă: Dacă treci un număr utilizat în consola OEM-codare (“0.866" ), personajele din program vor fi convertite în ea, care este, de asemenea, o soluție la problema noastră. Acest lucru poate fi realizat prin trecerea «.OCP» linie, ceea ce înseamnă codul paginii OEM și setează locale la sistemul actual de operare cu coduri de OEM.

4) ID-ul în format POSIX - «Russian_Russia.1251»

5) Să linia - "" Dacă vom face acest lucru, programul va seta pagina de cod a sistemului de operare implicit, în acest caz corespunde cp1251.

Ie setarea locale, în cel mai simplu caz este după cum urmează:

using namespace std;

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