Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Kódování znaků vnitřní reprezentace znaků v paměti počítače pomocí čísel zobrazení mezi písmeny (pro lidi) a čísly (pro počítače) Zpočátku jen pro angličtinu,

Podobné prezentace


Prezentace na téma: "Kódování znaků vnitřní reprezentace znaků v paměti počítače pomocí čísel zobrazení mezi písmeny (pro lidi) a čísly (pro počítače) Zpočátku jen pro angličtinu,"— Transkript prezentace:

1 Kódování znaků vnitřní reprezentace znaků v paměti počítače pomocí čísel zobrazení mezi písmeny (pro lidi) a čísly (pro počítače) Zpočátku jen pro angličtinu, tj. stačilo 7 bitů ASCII - American Standard Code for Information Interchange řídicí znaky písmena anglické abecedy znaménka (<>;:"/, apod.)

2 ASCII American Standard Code for Information Interchange

3 Neviditelné znaky ASCII Prvních 32 znaků tabulky – řídicí znaky Původně pro řízení dálnopisu nebo tiskárny Nejčastěji používané speciální znaky: SPC space, mezera, „prázdný znak“ HT Horizontal Tab - tabulátor LF Line Feed- odřádkování CR Carriage Return - návrat vozíku BSBack Space

4 ASCII – začátek tabulky DecHexZkratkaVýznam 000NULNullNull character 101SOHStart of Header 202STXStart of Text 303ETXEnd of Text 404EOTEnd of Transmission 505ENQEnquiry 606ACKAcknowledge 707BELBell 808BSBackspace 909HTHorizontal Tab 100aLFLine Feed 110bVTVertical Tab 120cFFForm Feed 130dCRCarriage Return 140eSOShift Out 150fSIShift In 1610DLEData Link Escape DecHexZkratkaVýznam 1711DC1(XOn) 1812DC2 1913DC3(XOff) 2014DC4 2115NAKNegative Acknowledge 2216SYNSynchronous Idle 2317ETBEnd of Transmission Block 2418CANCancel 2519EMEnd of Medium 261aSUBSubstitute 271bESCEscape 281cFSFile Separator 291dGSGroup Separator 301eRSRecord Separator 311fUSUnit Separator

5 ASCII nestačí - kódové stránky jen 7 bitů, pro angličtinu bez problémů osmý bit se využil „živelně“ pro národní abecedy – různé znakové sady, např. čeština: ISO Latin2, Windows 1250, Kamenických,... Prvních 7 bitů VŽDY stejné, tj. ASCII „code page”, česky: ≈ kódová stránka, kódování, znaková sada

6 Norma ISO 8859 Latin-1 –zaopatří většinu západoevropských jazyků –přidáno 96 písmen –kódování Windows-1252 dalších 27 Latin-2 – – pro středoevropské a východoevropské jazyky (ne azbuka) –jen částečně kompatibilní s Latin-1 Latin-3, Latin-4, Latin-5, … Latin-10

7 Kódové stránky nestačí - Unicode Problémy: –Více znaků v 1 dokumentu –Převod mezi kódovými stránkami –Přenositelnost textů Unicode „The Unicode Standard is a character coding system designed to support the worldwide interchange, processing, and display of the written texts of the diverse languages and technical disciplines of the modern world. In addition, it supports classical and historical texts of many written languages.“

8 Unicode Standard Zodpovědný za interpretaci znaků Nedefinuje grafickou podobu znaků Prvních 128 znaků je ASCII Prvních 256 znaků ze sady ISO Latin 1 Jednoznačné pojmenování každého znaku Znaky se mohou (jenom) přidávat – stabilita

9 How Many Different Characters? a A à á â ã ä å ā ă ą a a a a a a a a a a a

10 Unicode Každému znaku je přiřazen –název –číselný kód, tzv. „code point“, např. A je U+0041 Celkem znaků s kódy 0 16 až 10FFFF částí, každý o velikosti 2 16 První část = Basic Multilingual Plane (BMP) –obsahuje znaky běžně používaných abeced

11 Unicode a jeho kódování UTF-32 –všechny znaky ve 4 bytech –Výhoda: stejná délka všech znaků –Nevýhoda: plýtvání místem UTF-16 –kompromis mezi úsporností a kompaktností –nejčastější znaky (BMP) ve 2 bytech, ostatní ve 4

12 UTF-8 Unicode Transformation Format-8. ASCII znaky (code points 0-127) mají stejný kód, –tj. jen v 1 bytu, (v Americe si toho vůbec nevšimnou) –ostatní znaky ve 2 až 6 bytech bitůhex minhex maxzapsaná posl. bytů ve dvojkové soustavě F0vvvvvvv FF110vvvvv 10vvvvvv FFFF1110vvvv 10vvvvvv 10vvvvvv

13 UTF-8 příklady Char.Binary code pointBinary UTF-8 Hexadecimal UTF-8 $U ¢U+00A C2 A2 €U+20AC E2 82 AC U+24B F0 A4 AD A2

14 Kódování, konverze Každá aplikace pracující s textem musí bezpodmínečně vědět, v jakém kódování je text zapsán Jinak se kódy špatně interpertují - i zobrazí Konverze mezi kódováními –existuje-li příslušný znak v obou kódováních – OK –neexistuje-li – zobrazí se např. jako ?, nebo �, nebo jiný znak, nebo se vypíše kód,... příkaz iconv

15 Nastavení kódování - locale(s) je soubor jazykových, národních a kulturních pravidel, jako jsou znaková sada, formáty data, času a měny, pravidla pro abecední třídění, a také jazyk zpráv a uživatelského prostředí vůbec. Locale je třeba napřed nastavit v shellu. Důležité proměnné prostředí pro správné zobrazení češtiny: 1.LC_ALL – nastaví všechno najednou 2.LC_kategorie – nastaví konkrétní kategorii 3.LANG – použije se, není-li nastavena kategorie

16 LC_kategorie LC_kategorie nastavují jednotlivé kategorie. Standardní jsou tyto: LC_COLLATE (pravidla třídění), LC_CTYPE (vlastnosti znaků, malá a velká písmena), LC_MONETARY (formát měny), LC_NUMERIC (formát čísel), LC_TIME (formát data a času), LC_MESSAGES (jazyk zpráv a uživatelského rozhraní).

17 Jak nastavit UTF-8 Příkaz less –proměnná LESSCHARSET hodnota: "utf-8" (místo "ascii", "latin1",...) Perl –proměnná PERL_UNICODE hodnota: SAD

18 Proměnná PERL_UNICODE Musí být nastavena na SAD: S … STDIN, STDOUT i STDERR budou v UTF-8 D … všechny vstupy i výstupy budou otevřeny v UTF-8 A … prvky se interpretují jako řetězce v kódování UTF-8 Lze zadat i přepínačem -C na 1. řádce skriptu: #!/usr/bin/perl -CSAD use utf8;

19 Nastavení proměnné prostředí v shellu bash: export VARIABLENAME="value" setenv VARIABLENAME "value" csh/tcsh: Zobrazení hodnoty proměnné: echo $VARIABLENAME echo $SHELLecho $LC_ALL bez mezer!

20 Nastavení proměnné prostředí v shellu bash: export LESSCHARSET="utf-8" setenv LESSCHARSET "utf-8" csh/tcsh: bez mezer!

21 Nastavení locales Obecný formát hodnot: export LC_ALL="cs_CZ.ISO " setenv LC_ALL "cs_CZ.ISO " csh/tcsh: bash: Pro češtinu: Nebo alias: cs_CZ.ISO czech cs_CZ.UTF-8

22 Další příklady locales Obecný formát hodnot: Pro němčinu: Pro angličtinu jich je několik, např: en_US.UTF-8 en_NZ.UTF-8 de_DE.UTF-8

23 Problémy s češtinou Je-li kódování nastaveno „špatně“, potom: Znaky s diakritikou se ne vždy považují za alfanumerické znaky Vadí to nejen při zobrazování, ale i při –třídění –vyhodnocování regulárních výrazů (později) –převodu na velká / malá písmena –... Je třeba použít use locale; Nefunguje dobře pro UTF-8 !!!... viz dále

24 Otevírání souborů 2 způsoby 1.pro čtení (vstupní soubor) open(VSTUP,“pearl.txt"); Lze otevřít více souborů pro čtení. 2.pro výpis (výstupní soubor) open(OUT,">/export/home/martin/prijmeni.out"); open(OUT,">>/export/home/martin/prijmeni.out"); Lze otevřít více souborů pro výpis.

25 Unicode Třeba explicitně uvést, že pracujeme v kódování UTF-8: #!/usr/bin/perl -CSAD use utf8; Otevírání textových souborů v kódování UTF-8: open(VSTUP, "<:utf8", "pearl.txt"); open(OUT, ">:utf8", "prijmeni.out"); open(OUT, ">>:utf8", "prijmeni.out"); Je-li nastaveno #!/usr/bin/perl -CSAD nebo proměnná PERL_UNICODE, není třeba 2.argument

26 Ovladač souboru (filehandle) Standardní – vždy k dispozici –STDIN –STDOUT –STDERR – výpis chyb Ostatní je třeba explicitně otevřít pomocí funkce open([ovladač souboru],[mode],[jméno souboru]); Ovladač souboru se tradičně píše velkými písmeny Zavírání souboru: close([ovladač souboru]);

27 Testování souborů Otevření souboru může být problematické => testy -rsoubor lze číst -wdo souboru lze zapisovat -xsoubor je spustitelný -esoubor existuje -fjde o soubor -djde o adresář -zsoubor má nulovou délku -ssoubor má nenulovou délku if(! (–e "soubor")) { open(S,">soubor") } if(-s "vstup" and -r "vstup") { open(V,"vstup") }

28 Příkaz die Perlovský idiom: open(SOUBOR,"s.txt") or die "Soubor s.txt nejde otevřít."; die ukončí program a vypíše hlášku na STDERR. Co to znamená? Umíte to zapsat jinak? Speciální proměnná $! pro výpis chybových hlášek: open(SOUBOR,"s.txt") or die "Problém: $!\n"; Když se neotevře soubor, vypíše se např. Problém: Permission denied.

29 Čtení ze souboru Příklad open(VSTUP,"pearl.txt"); $prom = ; # do $prom se uloží 1. řádek ze souboru "pearl.txt" my $cislo_radku = 1; while( ) # totéž jako while($_ = ) { print $cislo_radku++, " ", $_; } close VSTUP;

30 Zápis do souboru Do příkazu print napíšeme ovladač souboru, do kterého se má zapisovat print VYSTUP "toto se zapíše do výstupního souboru.\n"; Nezapíše-li se ovladač, zapisuje se do STDOUT print "toto se zapíše na standarní výstup.\n"; totéž jinak (většinou): print STDOUT "toto se zapíše na standarní výstup.\n"; Tady není čárka !!!

31 Zápis do více souborů (ne najednou) Lze otevřít více souborů a zapisovat pokaždé do jiného –např. ladicí tisky na STDOUT nebo do zvláštního jiného souboru (např. LOG), ostatní výstupy do výstupního souboru open(LOG,">log.txt"); open(VYSTUP,">ven.txt"); print LOG "toto se zapíše do souboru log.txt.\n"; print VYSTUP "toto se zapíše do souboru ven.txt.\n"; Ale máme i příkaz select: select LOG; print "toto se zapíše do souboru log.txt, ne na STDOUT!\n";

32 Parametry souboru Při spouštění programu se parametry píšou za jméno souboru Příklad: přepis souboru s očíslovanými řádky –program, který přečte všechny zadané soubory a vypíše je tak, že každý řádek předchází jeho pořadí –nevíme předem, kolik bude souborů Spuštění programu:./pocitej.perl soubor_1 soubor_2... soubor_n parametry jsou odděleny mezerami

33 Příklad s foreach $s { my $cislo_radku = 1; open(VSTUP, $s) or die "Nelze otevřít soubor $s\n"; open(VYSTUP, ">${s}.out") or die "Nelze otevřít...."; print "---- $s ----\n"; while($prom = ) { print VYSTUP $cislo_radku++, " ", $prom; }

34 Jméno souboru, který se má zpracovat (vstupní soubor) –může jich být víc Jméno souboru, který má být výsledkem (výstupní soubor) –i těch může být víc Číselné parametry – př.: sečíst čísla od N do M Příklad : jednoduchá kalkulačka

35 Perl z příkazového řádku Krátké prográmky na jedno použití není třeba uchovávat, lze je spustit přímo z příkazové řádky perl volba Volby -e "příkaz(y)"provede se příkaz -npříkaz se obalí cyklem while -pjako -n, navíc se řádky vytisknou na STDOUT -vvypíše verzi Perlu perl -pe "s/\r//" W_soubor.txt > U_soubor.txt perl -ne "print if/aby/"

36 Perl z příkazového řádku - Unicode Další volba -C pro práci s kódováním UTF-8 stejné jako pro první řádku skriptu – hodnota SAD perl -CSAD -pe "use utf8;..." perl -CSAD -ne "use utf8; print if/aby/" soubor.txt perl -Mlocale -ne "print if/aby/" soubor.txt


Stáhnout ppt "Kódování znaků vnitřní reprezentace znaků v paměti počítače pomocí čísel zobrazení mezi písmeny (pro lidi) a čísly (pro počítače) Zpočátku jen pro angličtinu,"

Podobné prezentace


Reklamy Google