» »

[C++] Slovenski znaki v Command Promptu

[C++] Slovenski znaki v Command Promptu

Makronaut ::

Pozdravljeni.

Pišem preprost programček v jeziku C++ in imam težavo z izpisom šumnikov v ukaznem oknu oken XP.

če jih hočem izpisati preko standardnega izhoda s pomočjo ukaza cout, mi izpiše neke čudne znake, večinoma po standardni ASCII kodni tabeli, vendar ne vseh Sam pa bi seveda rad videl nam vsem domače šumnike.

Kot prevajalnik uporabljam gcc v navezi z MinGW in DEV-C++.

Hvala za pomoč.
  • spremenilo: snow ()

jan01 ::

windowsov cmd je kriv. Preusmeri izhod v datoteko. Pa sploh uporabljaš utf8 ali unicode?

Makronaut ::

Če preusmerim izhod v datoteko, se znaki izpišejo normalno, vendar jaz potrebujem tudi izpis v CMD.

Kje pa lahko nastavim kodno tabelo(utf-8 ali unicode)?
Oziroma, kje lahko to preverim?

lp

Zgodovina sprememb…

  • spremenilo: Makronaut ()

radovid ::

No, pravzaprav...

sem izvedel preko ukaza "chcp", da imam codepage:
852, kar je tudi pričakovano saj, ko tipkam CMD izpisuje šumnike po pričakovanjih.
Znakov iz mojega programa pa mi vseeno ne izpiše. Zakaj tako?
Kaj pri C++ se po stnadardu izpisi v standardni izhod odvijajo preko unicode?

lp

Zgodovina sprememb…

  • spremenilo: radovid ()

Irbis ::

Manjša zmeda v Windows je, da cmd uporablja CP852 (zaradi združljivosti z Dosom), sami Windows pa CP1250. Zato ti izhod v datoteko dela v redu, ker ga potem odpreš z Windows programom. Če pa narediš "type", pa ravno tako ne bo pravih čšž.
Mogoče bi se dalo kaj narediti s setlocale.

Makronaut ::

Sem poskusil s setlocale, ampak nima veze z kodno tabelo.

Sem pa videl, da imajo Microsoftove knjižnice posebne funkcije za tovrstne pretvorbe iz
ASCII kode v OEM. Kaj ve kd za kake podobne v SCL oz. ANIS C++?
Mogoče v sklopu knjižnic wx?

lp

Gundolf ::

Poglej kaj vse se skriva v std headerju locale. Mislim da obstaja način za pretvorbo codepageov.

SasoS ::

Spiši funkcijo sam. Evo tabelce, najbrž bo še komu prišla prav (vrednosti so decimalne, razen UTF-8)

    ISO-8859-2	YU     CP852   CP1250  AppleCE UNICODE   UTF-8

Š	169	91	230	138	225	352	0xc5,0xa0
š	185	123	231	154	228	353	0xc5,0xa1
Č	200	94	172	200	137	268	0xc4,0x8c
č	232	126	159	232	139	269	0xc4,0x8d
Ž	174	64	166	142	235	381	0xc5,0xbd
ž	190	96	167	158	236	382	0xc5,0xbe
Đ	208	92	209	208	208	272	0xc4,0x90
đ	240	124	208	240	240	273	0xc4,0x91
Ć	198	93	143	198	140	262	0xc4,0x86	
ć	230	125	134	230	141	263	0xc4,0x87

Makronaut ::

takole.

Če napišem naslednjo kodo:

coutam ' \230'

mi izpiše v CMD: s z ostrivcem.

Če vnesem v CMD ukaz chcp, mi izpiše, da je nastavlena kodna tabela 852.
Tako, da mi iz nekega čudnega razloga zgornja tabela ne pomaga.

Kombinacije z cp1250 dajejo podobno nezadovoljive rezultate.

Na nekaj takega sem tudi sam pomislil že pred časom, pa nisem našel tabele, ki bi pomagala.
Zares skrivnostno... :|


Sem pa mimogrede odkril še eno težavo...

Sem poskusil z rabo wide char, ki naj bi bil ravno temu namenjen, pa me kompiler zafrkava... grr;( .

torej z rabo funkcij wcout, in definicij wstring in wchar_t.
Pa mi javi, da ne najde funkcije wcout.
vključil sem:
zakaj ne morem napisati string med < >?
iostream
cstring
wchar.h

pa ne gre. Zgleda, da je nekaj narobe z priloženimi knjižnicami.

Ima kdo še kako ideo?

mimgrede... Kako vnesem C-jevsko kodo, ne da bi mi javljalo napake?
npr. za-cout in-string?

lp

Gundolf ::

Kaj ti pa wchar.h naredi? To ni standardna c++ knjižnica.

cout in wcout (za katerega nisem 100% da obstaja) nista funkcije ampak objekta (spremenljivke). A če pa v cout pošlješ wstring ti ne pomaga?

Tule v forum vnašaš kodo tako da jo daš v tage:
[st.koda c]
cout << "krneki";
[/st.koda c]

Makronaut ::

wcout obstaja in se rabi npr. na naslednji način:

wcout<<L"ŠĐŽČĆšđžčć";

Namenjen pa je izpisu širokih znakov (wide char) in večzlogovnih znakov. Je neke vrste brat dvojček poznanega cout in je del standardne c knjižnice. Brez wcout in podobnih objektov ter funkcij nebi bilo možno pisati c-jevskih programov, ki bi prikazovali unicode.

Wchar pa je del libstdc++.

Cout sam ne prepozna wstring, ker je wstring definiran tako, da za en znak porabi dva zloga. Standardno, pa je en znak -> en zlog. Zato pa se rabi wcout.

Kot zgleda (tudi glede na objave na drugih forumih)), je napaka v libstdc++ a nihče nima pojma kje. Še nisem našel objave, kjer bi se kdo pohvalil s tem, da je rešil problem.

Še pri vsem skupaj je najbolj zabavno to, da če prevedeni program poženem v konzoli Msys, se šumniki prikažejo in to brez nobenih čarovnij :| .

Torej se lahko težave lotim tudi tako, da poskusim prelisičiti CMD, a kaj, ko četudi spremenim cp na 1250 se zgodi isto.

8-O

vsak predlog je dobrodošel :D

Gundolf ::

No, če je problem v libstdc++, potem je ena rešitev, da najdeš drugo implementacijo standardne knjižnice. Čeprav dvomim, da je še katera free. Microsoftova najverjetneje ne bo delala na gcc-ju.

wchar.h pa pomoje ne rabiš includat v tvojem programu. Če wchar_t še ni implementiran v compilerju, potem ga sigurno implicitno includaš s iostramom, in stringom. Ta fajl pač ni standardni del c++, zato sem to rekel. Je pa v bistvu vseeno (vsaj dokler ne portaš programa kam drugam).

Ok, še ena neresna rešitev. Izpiši v konzolo eno tabelo 16x16 vseh znakov torej ta sistem:
for (int y=0; y<16; ++y) {
   for (int x=0; x<16; ++x)
      std::cout << (char)(y*16 + x) << " "
   std::cout << "\n";
}

Nato pa poglej pod katero kodo se ti skrivajo šumniki in nato sam naredi transformacijsko tabelo.

SasoS ::

\xxx je oktalna predstavitev. Če napišeš \346 (=230 decimalno) boš dobil ven Š v konzoli

Makronaut ::

Zdravo.

Zadnja dva odgovora sta mi pojasnila točno to, kar sem iskal, sem namreč povsem spregledal, da pošiljam zadeve v standardni izhod v osmiškem... :8)

Z knižnjico stdlibcc, pa je tako, da bi jo moral na novo prevesti z drugačnmi nastavitvami.

V kolikor bi koga zanimalo in v kolikor se bom lotil zadeve bom sporočil, kako je zadeva uspela.

Hvala vsem.

lp

Zgodovina sprememb…

  • spremenilo: Makronaut ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Unicode decode

Oddelek: Programiranje
121954 (1412) Randomness
»

VB 2008 težava s printanjem oz. napačna kodna tabela

Oddelek: Programiranje
5755 (696) RuN
»

kodna tabela za generacijo pdf dokumentov s php-jem

Oddelek: Programiranje
61314 (1179) sajmun
»

Tiskanje šumnikov iz DOS-a

Oddelek: Pomoč in nasveti
164775 (4266) Brane2
»

[C++] Unicode, Utf...

Oddelek: Programiranje
61498 (1381) Matako

Več podobnih tem