banjalukaforum.com
https://banjalukaforum.com/

Ispis unicode znakova u cmd preko C++-a?
https://banjalukaforum.com/viewtopic.php?f=18&t=61849
Stranica 1 od 2

Autoru:  AIV [ 17 Okt 2012, 20:17 ]
Tema posta:  Ispis unicode znakova u cmd preko C++-a?

Zanima me na koji nacin mogu da ispisem č, š,... u cmd preko c++-a?

Autoru:  <Enter_name> [ 17 Okt 2012, 20:25 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

#include <locale.h>
setlocale(LC_ALL, "");

Autoru:  AIV [ 18 Okt 2012, 15:20 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

I kako onda ispisujem, preko cout, wcout ili neceg drugog?

Autoru:  <Enter_name> [ 18 Okt 2012, 15:47 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Čime te volja...

Autoru:  AIV [ 19 Okt 2012, 17:57 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Ne radi. xD

Autoru:  <Enter_name> [ 19 Okt 2012, 18:09 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Radi, radi... neznanje nije opravdanje ;) Ili si ti već rješio problem, pa samo ispituješ kako se to radi... :D

Autoru:  Hristov [ 19 Okt 2012, 20:48 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Podesi u konzoli font "Lucida Console", obrati pažnju da ti encoding stringa koji šalješ konzoli odgovara code page-u konzole. Code page za latinski (znači za naša slova) je 852, sa komandom "chcp" možeš provjeriti koji ti je default code page, default je 850. Sa komandom "chcp 852" možeš prebaciti code page konzole na latinski.

Autoru:  <Enter_name> [ 19 Okt 2012, 22:22 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Slika

Još šta?

Autoru:  Hristov [ 20 Okt 2012, 10:00 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Enter, kod tebe koliko vidim je default file encoding UTF-8, što kod momka ne mora biti slucaj. Ti koristiš GNU kompajler, što kod momka ne mora biti slucaj. Kod tebe odmah ispisuje na konzoli kvacice, što zavisi od code-page-a konzole, a kod momka ne mora biti isti code-page kao i kod tebe. Cak i da je instalirao istu verziju Dev-Cpp-a kao i ti, ne znaci da mora funkcionisati kod njega. ANSI može da koristi razlicite code-pages od kompa do kompa, jedan jedini kompjuter može imati totalno poseban code-page, itd...

AIV, napisacu ti par hintova ako ti još uvijek treba.

Naša slova možeš pisati u fajl direktno ili sa unicode escape-sekvencama. Ako pišeš direktno slova sa kvacicama kao što je slušaj u screenshot-u od Entera, onda moraš osigurati da ti je fajl u UTF-8 sacuvan. Ako naša slova pišeš preko unicode escape-sekvenci (npr. Š = \u0160), onda možeš ostaviti default encoding (vecinom ANSI, tj. Cp1252, ali to opet zavisi od sistema i IDE, kod nekih IDE može biti UTF-8 without BOM). Moraš imati na umu da i sam compiler ima default encoding kojim cita fajlove kad ih kompilira.
Znaci, ako encoding tvoga fajla odstupa od default encodinga koji koristi compiler da ucita fajl, moraš pri pozivu kompajlera da mu kažeš koji file-encoding da koristi (pokazacu ti na primjeru).

Druga stvar je da kad kompiliraš svoj izvorni fajl, string-konstante ili string-literali u tvom kodu moraju biti poslani konzoli u pravom encodingu, jer konzola ima svoj encoding koji koristi da dekodira byte-stream koji joj šalje neka aplikacija. Ako recimo konzola koristi code-page Cp850 u kojem nema vecine naših slova, ti možeš slati šta hoćeš i opet nece prikazati sva naša slova, osim toga bitno je da i vrsta fonta konzole bude odgovarajuca jer default tip fonta konzole ne može graficki prikazati naša slova, zato prebaci na "Lucida Console" ako ti ne radi sa default (raster). Znaci cak i kad bi svoje stringove poslao konzoli u Cp850, ne bi vidio sva svoja slova jer jednostavno Cp850 u sebi nema sva naša slova.
Cp852 sadrži sve ono što ti treba, zato svoje stringove možeš kodirati sa Cp852 ili UTF-8 (Cp65001), ali ti i konzola mora koristiti isti taj encoding, znaci aplikacija i konzola moraju koristiti isti kljuc za (de-)kodiranje poruka.


Poci cu od toga da koristiš GNU (g++) kompajler, ako koristiš drugi kompajler onda treba isti princip da primjenis i kod njega. U "Properties" konzole sam podesio font na "Lucida Console". Kad pozivam kompajler predajem mu uvijek opciju -finput-charset=UTF-8 iako je kod mene default UTF-8 tako da je ovo suvišno, ali navodim opciju za slučaj da ti zatreba.

Izvorni kod:
Kod:
#include <iostream>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   using namespace std;
   cout << "ЊŽČĆ - đšžčć\n";
   system("pause");
   return 0;
}


Moji komentari su desno i počinju sa // ***
Kod:
D:\Development\Dev-Cpp 5.3.0.1\Workspace>chcp
Aktive Codepage: 850.

D:\Development\Dev-Cpp 5.3.0.1\Workspace>g++ -finput-charset=UTF-8 -fexec-charset=Cp850 -o main.exe main.cpp
main.cpp: In function 'int main(int, char**)':
main.cpp:8:10: error: converting to execution character set: Illegal byte sequence // *** Ne mogu se sva naša slova prevesti u Cp850

D:\Development\Dev-Cpp 5.3.0.1\Workspace>g++ -finput-charset=UTF-8 -fexec-charset=Cp852 -o main.exe main.cpp

D:\Development\Dev-Cpp 5.3.0.1\Workspace>main
еªÅ¼ - ðþºåƒ      // *** Ne radi jer iako sada šaljem naša slova encodirana sa Cp852, konzola još uvijek interpretira byte-stream sa Cp850 ....
Drücken Sie eine beliebige Taste . . .

D:\Development\Dev-Cpp 5.3.0.1\Workspace>chcp 852 // *** ... Zato mijenjam code-page konzole
Aktive Codepage: 852.

D:\Development\Dev-Cpp 5.3.0.1\Workspace>main
ĐŠŽĆČ - đšžćč // *** OK!
Drücken Sie eine beliebige Taste . . .

D:\Development\Dev-Cpp 5.3.0.1\Workspace>chcp 65001 // Sada mijenjam u Windowsow code-page za UTF-8
Aktive Codepage: 65001.

D:\Development\Dev-Cpp 5.3.0.1\Workspace>main
�榏� - �秆� // *** Ne radi jer je byte-stream kodiran sa Cp852 ....
Drücken Sie eine beliebige Taste . . .

D:\Development\Dev-Cpp 5.3.0.1\Workspace>g++ -finput-charset=UTF-8 -fexec-charset=UTF-8  -o main.exe main.cpp // *** ... Zato kodiram byte-stream sa UTF-8

D:\Development\Dev-Cpp 5.3.0.1\Workspace>main
��ŠŽĆČ - đšžćč // *** Radi osim za 'Đ', to je kod mene slučaj, možda kod tebe radi
Drücken Sie eine beliebige Taste . . .

D:\Development\Dev-Cpp 5.3.0.1\Workspace>

Autoru:  <Enter_name> [ 20 Okt 2012, 11:02 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

setlocale - C++ Reference
setlocale(LC_ALL, NULL) vraća Bosnian (Latin)_Bosnia and Herzegovina.1250, kako je i podešeno na računaru; ako je podešen neki drugi locale, ispris neće raditi pravilno, naravno.
GCC sam koristio za primjer, isto se ponašaju i MSVC i ICL... ali čisto sumnjam da će mu sve ovo napisano biti od pomoći ;)

Autoru:  Hristov [ 20 Okt 2012, 11:18 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Šta ti izbaci u konzoli kad ukucaš "chcp" ili "mode con", koji code-page, pretpostavljam 1250 ? AIV nije napisao koji locale ima.

Autoru:  <Enter_name> [ 20 Okt 2012, 11:28 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

852, zato što je tako podešeno na Windowsu, ali setlocale radi override toga... npr.:
Kod:
#include <iostream>
#include <stdlib.h>
#include <locale.h>
int main(int argc, char *argv[]) {
   using namespace std;
   setlocale(LC_ALL, "C");
   cout<<"ŠĐČĆŽ\n";
   system("chcp");
   return 0;
}
ispisuje:
Kod:
Őđ╚ĂÄ
Active code page: 852

Autoru:  <Enter_name> [ 20 Okt 2012, 11:54 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

I naravno, ovo što sam naveo kao primjer zavisi od locale-a setovanog na mašini. Ako se ručno setuje naš locale (sa setlocale), a code page konzole je 850 (ili neki drugi), dobiće ispis naših slova bez interpukcijskih znakova (a ne brljotinu).
Kod:
#include <iostream>
#include <stdlib.h>
#include <locale.h>
int main(int argc, char *argv[]) {
   using namespace std;
   system("chcp 850");
   setlocale(LC_ALL, "Bosnian (Latin)_Bosnia and Herzegovina.1250");
   cout<<"ŠĐČĆŽ\n";
   return 0;
}
Kod:
Active code page: 850
SDCCZ
U tom slučaju, tvoje rješenje je univerzalnije...

Autoru:  Hristov [ 20 Okt 2012, 13:00 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Mislim da locale nije potreban posto samo tangira funkcije koje formatiraju datum i valutu, na obične stringove mislim da nema uticaja, ne znam..

AIV, možeš da probaš ovako:

Kod:
#include <iostream>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   using namespace std;
   system("chcp 852"); // *** ovo je najvaznije, da na pocetku aplikacije promijenis code-page konzole
   cout << "ĐŠŽČĆ - đšžčć\n\n";
   return 0;
}


A fajl kompiliraš sa:
Kod:
g++ -fexec-charset=Cp852 -o main.exe main.cpp


Ono sa system("chcp 852") je ruzno i ne preporucuje se da se koristi system, ali svasta se nesto preporucuje pa se ipak koristi, i Eclipse obilno koristi Runtime.exec().

Mali hint: sa setlocale(LC_ALL, ".852") mozes promijeniti code-page bez da mijenjas zemlju i jezik.

Autoru:  blaf77 [ 20 Okt 2012, 13:39 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Hahah, klasicna AIV tema - covjek uradio zadacu i vise se ne pojavljuje.

Autoru:  AIV [ 21 Okt 2012, 20:29 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Ma kakva zadaca, evo sjetio sa se sad da sam postavio temu pa da provjerim sve ovo sto ste napisali :)

Autoru:  AIV [ 21 Okt 2012, 21:34 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Nista od ovoga ne radi, inace koristim Visual Studio 2012.

Autoru:  <Enter_name> [ 21 Okt 2012, 21:45 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Kao što već jednom napisah, neznanje nije opravdanje ;)

Autoru:  AIV [ 22 Okt 2012, 08:49 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

Hoce li neko da mu dam team viewer pa da mi udje u kompjuter i pogleda zasto ne radi?

Autoru:  dtb_pro [ 22 Okt 2012, 10:18 ]
Tema posta:  Re: Ispis unicode znakova u cmd preko C++-a?

AIV je napisao:
Hoce li neko da mu dam team viewer pa da mi udje u kompjuter i pogleda zasto ne radi?

Na debeloj sam kušnji, ali odoliću nekako :lol: .

Stranica 1 od 2 Sva vremena su u UTC [ DST ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/