Cirilica u konzoli

1

Cirilica u konzoli

offline
  • Na odmoru xD
  • Na odmoru xD
  • Pridružio: 15 Feb 2012
  • Poruke: 430

Da li mogu da stampam cirilicu u konzoli npr printf("Здраво свете!");. Da li se to moze izvesti u code blocks ili Visual Studio 2010 Ultimate i kako?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 26 Avg 2010
  • Poruke: 10621
  • Gde živiš: Hypnos Control Room, Tokyo Metropolitan Government Building

Aleksandr1996 ::Da li mogu da stampam cirilicu u konzoli npr printf("Здраво свете!");. Da li se to moze izvesti u code blocks ili Visual Studio 2010 Ultimate i kako?

C/C++ to ne mogu bez posebne biblioteke koja je još nepodesnija za korišćenje. Ako se dobro sjećam u pitanju je WCHAR. C# i Java su nativni unicode jezici pa bi sa njima trebalo da radi bez problema.



offline
  • Na odmoru xD
  • Na odmoru xD
  • Pridružio: 15 Feb 2012
  • Poruke: 430

Koja je to biblioteka i funkcija ? Ako moze primer. Javu i C# ne govorim xD

offline
  • Pridružio: 26 Avg 2010
  • Poruke: 10621
  • Gde živiš: Hypnos Control Room, Tokyo Metropolitan Government Building

Evo ti pa se igraj.

http://www.codeproject.com/Articles/76252/What-are.....PCTSTR-etc

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Imaj na umu da u konzoli mora biti podešen font koji ima ćirilične znake. Ako koristiš standardan font (Raster Fonts 8x12) onda ćeš videti samo znake pitanja. Uzevši u obzir da većina korisnika ima taj font, u konzoli nije pametno pisati nestandardnim karakterima.

Možeš da probaš da napraviš datoteku s imenom Здраво свете i da preko konzole dođeš do direktorijuma u kojoj se ta datoteka nalazi i da ukucaš dir. Videćeš da ni sam Windows u konzoli ne prikazuje ćirilična slova.

offline
  • Pridružio: 26 Avg 2010
  • Poruke: 10621
  • Gde živiš: Hypnos Control Room, Tokyo Metropolitan Government Building

Lucida Console prikazuje Unicode znakove, ako ti je bitno da to radi samo na tvom računaru.

offline
  • Na odmoru xD
  • Na odmoru xD
  • Pridružio: 15 Feb 2012
  • Poruke: 430

Beyond my comprehension Crying or Very sad Hvala na pomoci Ziveli

offline
  • Pridružio: 14 Jul 2012
  • Poruke: 51

Постоји више различитих начина да се програмски користи ћирилица у Виндоуз конзоли. Али оно што се увек мора урадити је поставити Defaults\Font конзоле на Lucida Console.

Е сад, реч ћирилица је довољно прецизна одредница када пишемо руком, али овде постоји читав низ ћириличних писама (односно енкодирања). Ако би смо говорили о Linux конзоли, довољно би било користити UTF8, јер колико се сећам све је тамо UTF8: подразумевано снимање текст едитора, приступ конзоли преко бафера тастатуре, испис на конзоли... Другим речима природан избор за ћирилицу у конзолном Це-програму на Linuxu је UTF8.

Што се тиче Windowsa пробај и сам: Notepad може снимити ћирилицу као (проширени) ASCII а то је заправо cp 1251, даље може је снимити као UTF8, али и као двобајтни UNICODE (ово последње у два распореда бајтова). Visual Studio и Notepad++, могу снимити изворни текст програма у каквом год пожелиш кодирању, али сама конзола подразумевано (када је system locale - Serbian (Cyrilic,Serbia)) и прихвата и исписује текст у егзотичним форматима DOS ћирилице (пробај да откуцаш у њој команду chcp па ћеш видети да је то нешто типа cp 855). Наравно да се можеш прилагодити конзоли и изворни код снимити као cp 855, али мислим да је боље конзолу прилагодити себи... Следећи пример треба снимити као cp 1251 (VS се у том смислу може и подразумевано подесити: Tools\Options\International Settings\Language Same as Microsoft Windows, када је system locale - Serbian (Cyrilic,Serbia)).

#include<stdio.h> #include<windows.h> int main(){    char poruka1[30]="Откуцајте нешто ћирилицом.";    char poruka2[30];    SetConsoleOutputCP(1251);//Поставити излазно кодирање    SetConsoleCP(1251);//Поставити улазно кодирање printf("Конзола ће овако декодирати текст који приказује: %d.\n",GetConsoleOutputCP()); printf("Конзола подразумева да ће улазни текст бити овако кодиран: %d.\n",GetConsoleCP());        printf("%s\n",poruka1);    scanf("%s",poruka2);    printf("%s?\tOK.\n",poruka2); }

Један алтернативни начин:

#include<stdio.h> #include<locale.h> int main(){    setlocale(LC_CTYPE, "srb");    printf("Здраво свете.\n"); }
Овај начин подразумева регионално и језичко подешавање оперативног система: Change system locale (види слику). О свему овоме можеш прочитати интересантан чланак (на руском).

offline
  • Na odmoru xD
  • Na odmoru xD
  • Pridružio: 15 Feb 2012
  • Poruke: 430

Hvala na odgovoru! Ziveli Ali ja sam vec zbrisao na Linux i tamo radi sve bez problema (kao podmazano Mr. Green ). Sad windows imam samo kao virtuelnu masinu zbog nekih programa.

offline
  • Pridružio: 14 Jul 2012
  • Poruke: 51

Ако некога интересује комплетан одговор на тему ћирилице, када је Windows конзола у питању:

0. У сваком случају треба поставити подразумевани фонт конзоле на пример на Lucida console (рестартовати конзолу да прихвати подешавање). Битно је да не остане подразумевано укључена опција Raster Fonts.

1. Ако конзолу подесимо да користи кодну страну 1251 (откуцамо chcp 1251), она ће правилно приказати стрингове у тексту програма снимљеном онако како се на виндоузу обично и снима (ANSI односно проширени ASCII т.ј. у нашем случају Windows 1251).
Дакле у којој кодној страни кодирамо, ту кодну страну користимо да програмски (помоћу SetConsoleCP() и SetConsoleOutputCP()) подесимо конзолу, што је логично. Пример је већ дат у претходном посту. А ево још једног примера (уместо две Win API функције може се користити један позив системском интерпретатору):

#include<stdio.h> #include<stdlib.h> int main(){ //Снимити у Windows 1251 кодирању    system("chcp 1251");    //system("chcp 1251 > null");    printf("Здраво свете!\n"); }

Конзола се може подесити за подразумевано кодирање 855 (DOS ћирилица), али се не може подесити за подразумевано кодирање 1251 (Windows ћирилица). Од регионалног и језичког подешавања оперативног система: Change system locale - зависи подразумевано кодирање знакова у конзоли (English USA поставља cp на 437, Serbian Cyrilic поставља cp на 855, Serbian Latin поставља cp на 852), али ова опција не омогућава дифолтно постављање конзоле на 1251. Дакле са подешеним system locale, у претходном примеру се могла и без додатног сетовања (chcp) користити дос-ћирилица (само снимимо као cp855) али онда се редирекцијом стандардног излаза програма не би добио у виндоузу читљив фајл. Зато смо снимали у кодној страни 1251 и сетовали конзолу да користи виндоуз ћирилицу (chcp 1251). ANSI се дакле користи без проблема.

2. а) Суштина проблема је у томе како виндоузову конзолу подесити да разуме ако се ради о уникодном тексту програма. Први начин је необичан, али за Unicode и UTF-8 with signature, на мајкрософтовом компајлеру - ради. Све је у томе да се у регионалном и језичком подешавању виндоуза на коме компајлирамо подеси system locale на Serbian (Cyrilic,Serbia) а то значи да подесимо виндоуз да користи кодну страну 1251 - ако у уникодно снимљеном тексту програма користимо ћирилицу. То је због тога што мајкрософтов компајлер при обради изворног кода реенкодира стрингове из уникода у локални ANSI код који одговара ономе што је подешено у локалном регионалном и језичком подешавању оперативног система за неуникодне програме - system locale. Окидач за пребацивање у овакав режим компајлера је сигнатура BOM.

#include <iostream> #include <string> #include <windows.h> using namespace std; int main()     { //Снимити као Unicode или UTF8 with signature или Windows 1251 у VC++         string rijec ;    SetConsoleOutputCP(1251);    SetConsoleCP(1251);            cout << "Унеси реч: " ;    cin >> rijec ;        cout << "Реч је " << rijec << endl;     }

2. б) Други универзалнији начин је (на VC++ недокументовано) коришћење UTF-8 без сигнатуре (конзола се подешава када откуцамо chcp 65001), али може се користити само ако не уносимо стрингове са тастатуре - још увек је тако. (Узгред речено VC++ има баг па њему UTF-8 без BOM сигнатуре ради са printf(), али не и са cout. Стрим cout ће радити ако користите gcc компајлер.) Ћирилични знакови су овде величине два char-a (два бајта), а иначе UTF-8 знакови су променљиве величине у зависности од врсте писма.

#include<stdio.h> #include <windows.h> int main()     { //Снимити као UTF8 without signature        //SetConsoleCP(65001);    SetConsoleOutputCP(65001);    printf("ASCII abcdexyz\nGerman äöüÄÖÜß\nPolish ąęźżńł\nRussian абвгдежэюя\nCJK 你好\n");    return 0;     }

2. в) Ако желимо да и Unicode користимо заиста (као малопре UTF-8 без BOM-a),
а не да се претвори у локално ANSI писмо, решење се заснива на трику: _setmode(_fileno(stdout), _O_U16TEXT), али овај начин није независан од избора компајлера.
Овде се користе широки знакови (wchar_t - чија је величина на виндоузу два бајта - довољно за UCS2).

#include <iostream> #include <io.h> #include <fcntl.h> int wmain(int argc, wchar_t* argv[]) { //Снимити као Unicode у VC++     _setmode(_fileno(stdout), _O_U16TEXT);     std::wcout << L"Testing unicode -- English -- Ελληνικά -- Español." << std::endl; }

Додатак:

Ако програмирамо у C#-у довољно је да system locale поставимо на Serbian Cyrilic, никакво даље програмско подешавање конзоле није потребно.
Ако програмирамо у C-у није довољно само да system locale поставимо на Serbian Cyrilic, пошто ће уникодни стринг који је део програма приликом компајлирања (у VC++ који уникодне стрингове подразумевано обрађује према system locale) бити реенкодиран у ANSI 1251 па га конзола (коју је исто то system locale подешавање поставило у режим DOS ћирилице) неће правилно приказати.
Иако тада проблема са учитавањем и исписом учитаног ћириличног стринга са тастатуре неће бити. Али треба разумети да конзолна апликација онда користи егзотична DOS кодирања за уноси и испис стринга. Зато проблем са стрингом који је део текста програма у овој варијанти остаје. Зато у програму користимо Win API функције SetConsoleOutputCP(1251) и SetConsoleCP(1251), да би и за стрингове из изворног кода и за оне учитане са тастатуре конзола користила виндоуз-ћирилицу а не дос-ћирилицу. Ово даље омогућава и редирекцију стандардног излаза у фајл који се може читати.

Ko je trenutno na forumu
 

Ukupno su 714 korisnika na forumu :: 27 registrovanih, 8 sakrivenih i 679 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _Sale, A.R.Chafee.Jr., Andrija357, Chainsaw, dane007, HDMI, krlebgd77, kuntalo, kvcali, Libertas, Lieutenant, MB120mm, menges, mercedesamg, mikrimaus, Mixelotti, mushroom, neutralal.com, nuke92, pein, Recce, rodoljub, saputnik plavetnila, SD, Smiljke, ss10, vlahale