Fórum Root.cz

Hlavní témata => Windows a jiné systémy => Téma založeno: BFU 26. 03. 2011, 10:51:43

Název: Vlastní Céčkový program a diakritika
Přispěvatel: BFU 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
Název: Re: Jak dostat do vlastního Céčkového programu diakritiku?
Přispěvatel: Michal Štrba 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.
Název: Re: Jak dostat do vlastního Céčkového programu diakritiku?
Přispěvatel: BFU 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
Název: Re: Jak dostat do vlastního Céčkového programu diakritiku?
Přispěvatel: SuLo 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.
Název: Re: Jak dostat do vlastního Céčkového programu diakritiku?
Přispěvatel: Zopper 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.
Název: Re: Jak dostat do vlastního Céčkového programu diakritiku?
Přispěvatel: Aleš Janda 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 ;)