Forum » Programiranje » [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č.
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 ()
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
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
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.
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
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:
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
Č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 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:
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.
vsak predlog je dobrodošel
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.
vsak predlog je dobrodošel
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:
Nato pa poglej pod katero kodo se ti skrivajo šumniki in nato sam naredi transformacijsko tabelo.
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.
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...
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
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...
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Unicode decodeOddelek: Programiranje | 1954 (1412) | Randomness |
» | VB 2008 težava s printanjem oz. napačna kodna tabelaOddelek: Programiranje | 755 (696) | RuN |
» | kodna tabela za generacijo pdf dokumentov s php-jemOddelek: Programiranje | 1314 (1179) | sajmun |
» | Tiskanje šumnikov iz DOS-aOddelek: Pomoč in nasveti | 4775 (4266) | Brane2 |
» | [C++] Unicode, Utf...Oddelek: Programiranje | 1498 (1381) | Matako |