Portál AbcLinuxu, 25. dubna 2024 11:36


Dotaz: nekorektný výpis ASCII tabuľky

Libco avatar 5.1.2013 11:13 Libco | skóre: 8 | Banska Bystrica - sk
nekorektný výpis ASCII tabuľky
Přečteno: 898×
Odpovědět | Admin
Příloha:
Pod Ubuntu mám IDE Code::Blocks.
V prílohe je jednoduchý program na výpis ASCII tabuľky v jazyku C.
Problém je v tom, že vypíše len znaky s decimálnou hodnotou od 33 do 126.
0 - 32 sú neviditeľné, to je v poriadku.
127 - 255 sú ale viditeľné a mne to vypisuje všade 0 (nuly).
Vie mi niekto poradiť, ako nastaviť Code::Blocks aby to fungovalo korektne?

Myslím, že treba nastaviť encoding na výstupe, ale neviem ako.
lama

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

mess avatar 5.1.2013 11:34 mess | skóre: 43 | blog: bordel | Háj ve Slezsku - Smolkov
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Neměl bys lepší použít funkci int putchar(int c); ? Každopádně to, co uvidíš na výstupu, bude záviset na zvoleném kódování. Vždycky se ti vypíše tabulka toho, které budeš mít zrovna zvolené. Takže si vyber kódování, jehož tabulku chceš vypsat; žádné jediné správné nastavení v tomhle případě není.
Cez párne mesiace zošíváš vaginy, cez neparne montuješ hajzle.
5.1.2013 11:36 Ariczek | skóre: 5
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Odpovědět | | Sbalit | Link | Blokovat | Admin
problem bude s tím, že char je signed... takže jsou v něm jen hodnoty od -128 do 127. Změň tu definici na unsigned char.
5.1.2013 11:57 Kit
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Odpovědět | | Sbalit | Link | Blokovat | Admin
ASCII je v rozsahu 0..127. Takže program funguje.
Libco avatar 5.1.2013 12:37 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Myslel som aj doplnkovú tabulku. Použitie, napr. diakritika v programe.
lama
5.1.2013 12:48 Kit
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Pokud používáš Ubuntu, znaky s diakritikou v programu budou nejspíš v UTF-8. Tady s ASCII nepochodíš.

Můžeš si to prověřit programem hexdump.
pavlix avatar 5.1.2013 13:00 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Mám za to, že ASCII je jasně definované a osmibitová kódování s pevnou šířkou znaku považuju za překonaná.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
5.1.2013 15:21 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
ASCI není pevně definované - pevně je definované pouze 0 až 127, od 128 do 255 si to určuje každý sám - jsou různé verze druhé půlky....IBM, ISO, KAM, LAT

Jinak i znaky 0 až 32 se daly tisknout a grafika je měla ve své rom paměti.

Jinak viz tabulka:

tabulka ascii znaků

wiki ASCII

Jinak k čemu to potřebuješ? Dnes se to už nepoužívá i když někde to přežívá.
5.1.2013 16:16 l4m4
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Nesmysly.

ASCII kódování je přesně definovnáno standarem vydaným ANSI.

I poslední verze tohoto standardu z roku 1986 definuje sedmibitové kódování.

Ta ‚druhá půlka‘ nemá s ASCII nic společného.

Kdyby sis tak přečetl aspoň tu stránku na Wikipedii.
Libco avatar 5.1.2013 16:17 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Napríklad úloha:
3) Vytvořte program pomocí cyklu,který vám na obrazovku vypíše všechny znaky, jako byste psali např. @ (Alt+64). Program se Vám bude hodit, ptž vypíše jak české znaky, tak určité znaky, o kterých možná ani nevíte. Pořád nevíte jak nato? Je to prosté, využijte schopnosti jak dostat češtinu do programu. Detailisti mohou ještě ve výpisu ukázat, jaký kód ke kterému znaku patří.

Úloha to priamo vyžaduje. Vo win to ide, ale v linuxe je problém.
lama
5.1.2013 16:30 l4m4
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Po nastavení HKCU\Control Panel\Input Method\EnableHexNumpad na 1 lze psát pomocí Alt-číselných sekvencí kterýkoli znak Unicode (není to default akorát kvůli konzervativnosti uživatelů, kterým to rozbilo některé naučené sekvence). Takže pokud to má něco vypsat, tak kompletní Unicode.
Libco avatar 5.1.2013 17:26 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Hľadal som "HKCU" aj "Control Panel" v CodeBlocku (ďalej len CB) aj v Ubuntu 12.04.1 a nenašiel, takže neviem ako to mám nastaviť.
V nastavení CB je možnosť nastaviť možno 40 rôznych kódovaní, to mám všetky skúšať zaradom? :-D
Ešte sa pozriem ako je to nastavené v CB vo win7. Možno tam niečo zaujímavé nájdem.
lama
Jendа avatar 5.1.2013 17:35 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Ta cesta byla cesta ve windowsím registru.

Přiznám se, že kdybych dostal podobné zadání, nevěděl bych, co s tím. Asi bych vypsal to, co ty, s tím, že na systému s UTF-8 (a dalšími vícebytovými kódováními) to prostě nebude fungovat.
Libco avatar 5.1.2013 17:49 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Musí byť možnosť. Diakritika sa predsa bežne používa.
lama
Jendа avatar 5.1.2013 18:20 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Ano, ale pomocí multibyte sekvencí. Takže si můžeš napsat generátor, který vygeneruje celé UTF-8 (je toho hodně).
5.1.2013 17:52 Kit
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Není to tak složité. Počet jedniček zleva u prvního bytu znamená, kolik má znak v UTF-8 celkově bytů. Pokud je však těch jedniček víc než 6, jedná se o speciální byte.

Pokud je tam jen jedna jednička, je to pokračovací byte. Pokud je v nejvyšším bitu nula, je to znak ASCII.
Libco avatar 5.1.2013 18:00 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Tak to teda dík. Budem si to musieť preložiť na drobné a otestovať.
lama
5.1.2013 18:14 l4m4
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Na konverzi codepoint (tj. čísla znaku) do UTF-8 najdeš spoustu zrecyklovatelných příkladů, včetně Wikipedie, to by neměl být takový problém.

Následně když na windowsí konzoli spustíš

chcp 65001

měla by se přepnout do UTF-8 codepage, takže vypisování v UTF-8 by mělo začít dělat něco rozumného (s rozumným konsolovým fontem, což nemusí být nutně default).

Poslední problém pak je, že Unicode má bratru čtyři miliardy možných znaků (codepoints) ale akorát kolem 120 tisíc je zatím přiřazeno. Vypsat jen ty přiřazené nejde bez nějaké knihovny pro práci s Unicode, která obsahuje příslušnou databázi. Na školní úlohu je to ale asi trochu overkill...
5.1.2013 18:31 Kit
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Nestraš. Těch znaků jsou jen 2 miliardy.
Libco avatar 5.1.2013 18:51 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Vidím, že sa už bavíte. To som rád. Aj tak si myslím, že časom nájdem jednoduché riešenie. Nemám to ako úlohu, len ma to zaujalo ako ťažko riešiteľný problém.
lama
5.1.2013 18:51 l4m4
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Máš pravdu, v ISO 10646 je to jen do 2^31 (byť běžná implementace je unsigned). Ale máme-li být přesní, tak Unicode jde jen do 0x10FFFF, protože má jen 16 vrstev (planes), a skoro všechno je tak jako tak přiřazeno z té první, tj. BMP. Z hlediska tazatele tím diskuse asi trochu odivergovala...

Co platí: ASCII = 7 bitů, Unicode = spousta bitů, 8 bitů = chaos, nepoužívat.
Libco avatar 5.1.2013 19:07 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Vidím, že si v tom doma. Teraz budem vlezlý.
Čo tak zariadiť, aby to aj v linuxe fungovalo ako vo win?
lama
5.1.2013 19:15 Kit
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Napodobovat Windows v Linuxu? Tak na to zapomeň. V Linuxu to funguje dobře. Pokud chceš nástroj, který bez problému pracuje s Unicode, použij Javu, Python, PHP nebo cokoliv dalšího. V C raději jen pomocí nějaké knihovny, kterou ani neznám.
Jendа avatar 5.1.2013 19:24 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Snad kdybys nastavil locales na nějaké non-UTF nebo použil recode/iconv pro konverzi z CP-1250 na UTF-8.
Řešení 1× (Libco (tazatel))
Libco avatar 5.1.2013 19:29 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Ďakujem za upresnenie páni. Súhlasím so všetkým čo ste napísali. ;-)
Už nejaký čas viem, že nemá význam niečo znásilňovať.
lama
6.1.2013 10:37 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky

Locale mu bude k ničemu, protože on na výstup zapisuje bajty. Respektive to není dostatečné.

Přenositelné řešení je:

  1. Vybrat si znakovou sadu, kterou autor chce zobrazit (ASCII to opravdu není, to je definované jen od 0 do 127).
  2. Každý znak z dané sady převést do znakové sady terminálu, což při správně nastaveném systému odpovídá locale. Zde je třeba si uvědomit, že ne všechny znaky musí být možné převést. Prostě ne nutně je jedna sada podmnožinou druhé.
  3. Převedený znak vypsat na terminál. Zde je třeba si uvědomit, že terminál může některé znaky interpretovat jako řídící, takže se na obrazovce nemusí objevit nic nebo se může stát něco divného (třeba terminál pípne nebo se smaže nebo bude růžový).
6.1.2013 12:06 Matlák
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Problém té úlohy je prostě v tom, že je napsaná pro Microsoft Windows a kódování znaků Windows-1250. Zadavatel zřejmě netuší, že něco jako jiná kódování existuje, natož něco jako jiné operační systémy.

Prostě podle hesla kdo neumí učí.
pavlix avatar 6.1.2013 14:47 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Natož že windows dávno interně přešly na nějakou formu unicode.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
pavlix avatar 6.1.2013 01:53 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
ASCI není pevně definované
ASCI možná ne, ale ASCII docela ano :).
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
Libco avatar 12.1.2013 09:59 Libco | skóre: 8 | Banska Bystrica - sk
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Přílohy:
Chcem sa všetkým ospravedlniť za moju neznalosť.
Uvedená úloha prináša potrebu použitia doplnkovej ASCII tabuľky (čo sa týka diakritiky) len vo windows.
V linuxe to vôbec nie je potrebné. Tu sa diakritika vypisuje správne.
V prílohách je vidno rozdiel.
lama
12.1.2013 12:22 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: nekorektný výpis ASCII tabuľky
I windows používá UNICODE.

Ovšem v konzoli to asi mapuje na jejich CP1250.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.