Vlastní Céčkový program a diakritika

BFU

Vlastní Céčkový program a diakritika
« kdy: 26. 03. 2011, 10:51:43 »
Dobrý den,

napsal jsem v C program. Pod mým Ubuntu běhá bez problému, vše je v pořádku.
Problém přijde, když program rozběhnu pod Windows. Diakritika se zobrazuje špatně.
Prosím, dá se to nějak vyřešit? Třeba vymlácením těch znaků odjinud?

Děkuji
« Poslední změna: 27. 03. 2011, 20:36:59 od Petr Krčmář »


Re: Jak dostat do vlastního Céčkového programu diakritiku?
« Odpověď #1 kdy: 26. 03. 2011, 11:41:23 »
Podla problemu predpokladam ze pouzivas anglicky windows a program beha v konzole. Pokial predpokladam spravne tak by to mohlo vyriesit doinstalovanie (neviem ci je to mozne) podpory pre cesky jazyk. Pokial by to nepomohlo mozes vyskusat pouzit PowerShell, nemam s tym skusenosti je to vylepseny shell pre windows mozno bude zobrazovat diakritiku spravne.

BFU

Re: Jak dostat do vlastního Céčkového programu diakritiku?
« Odpověď #2 kdy: 26. 03. 2011, 11:45:20 »
Používám českou verzi Windows.
Program běhá v konzoli.
PowerShell vyzkouším, až se dostanu k počítači s Windows.
Děkuji

SuLo

Re: Jak dostat do vlastního Céčkového programu diakritiku?
« Odpověď #3 kdy: 26. 03. 2011, 12:23:49 »
Mozno je problem v : Nastav si vo windowse v editore rovnake kodovanie ako v linuxe v editore. Napr. UTF-8.

Zopper

  • *****
  • 918
    • Zobrazit profil
Re: Jak dostat do vlastního Céčkového programu diakritiku?
« Odpověď #4 kdy: 26. 03. 2011, 12:55:15 »
Spíš bych naopak v editoru v linuxu nastavil cp-1250, či jak je česká kódová stránka pro windows. Pro plnou podporu UTF8 v C je tuším zapotřebí nějaký parametr při kompilaci.


Re: Jak dostat do vlastního Céčkového programu diakritiku?
« Odpověď #5 kdy: 26. 03. 2011, 21:48:45 »
Jazyk C národní kódování neřeší vůbec. C++ řeší kódování používáním wstring (a typu wchar_t; wstring je v podstatě pole hodnot typu wchar_t). Problém je způsoben tím, že různé operační systémy používají Unicode různě.

Linux používá utf-8, všude (resp. podle proměnné $LANG). Tam problémy zpravidla nejsou. Mac taky. Windows používají tři různá kódování: utf-16, windows-xxxx a pak ještě nějaká historické sady (u nás PC Latin 2). Problém je ten, že utf-16 je dvoubajtové kódování, takže musíš překladači explicitně říct, který řetězec v kódu má být ve dvoubajtovém kódování a který v jednobajtovém. Rodina windows-xxxx se použije, pokud je vstup/výstup jednobajtovej a z něho se překódovává na to utf-16. Bohužel, těch znakových sad je samozřejmě spousta, takže i když budeš psát ve windows-1250, bude ti to chodit pouze na Windows se středoevropskou lokalizací, jinde ne. A konečně třetí znaková sada se použije, pokud se vypisuje do terminálu. To je z historických důvodů, problémy samozřejmě stejné jako u windows-xxxx, jen se do toho vnáší ještě větší chaos.

Jediné řešení je používat wstring a wchar_t a všechno důsledně překódovávat. Typ wchar_t má na Linuxu i Windows velikost 2 bajty, na Macu 4 bajty. Typ wstring pak používá na Linuxu a Windows utf-16, na Macu utf-32. Pro zdrojáky programu pak použij všude utf-8 (s windows-1250 by sis nepomohl, naopak!).

Více viz manuál tvého překladače, u každého se to dělá trochu jinak a celkově je to masakr. Zejména při používání dalších knihoven, který třeba vrací zase jiný typ řetězce. Celkově jsem rád, že pro Windows už programovat nemusím ;)