36
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.)

K ódování znaků

  • Upload
    komala

  • View
    46

  • Download
    1

Embed Size (px)

DESCRIPTION

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 - A merican S tandard C ode for I nformation I nterchange řídicí znaky písmena anglické abecedy - PowerPoint PPT Presentation

Citation preview

Page 1: K ódování  znaků

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.)

Page 2: K ódování  znaků

ASCII

American Standard Code for Information Interchange

Page 3: K ódování  znaků

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

• BS Back Space

Page 4: K ódování  znaků

ASCII – začátek tabulky

Dec Hex Zkratka Význam

0 00 NUL Null character

1 01 SOH Start of Header

2 02 STX Start of Text

3 03 ETX End of Text

4 04 EOT End of Transmission

5 05 ENQ Enquiry

6 06 ACK Acknowledge

7 07 BEL Bell

8 08 BS Backspace

9 09 HT Horizontal Tab

10 0a LF Line Feed

11 0b VT Vertical Tab

12 0c FF Form Feed

13 0d CR Carriage Return

14 0e SO Shift Out

15 0f SI Shift In

16 10 DLE Data Link Escape

Dec Hex Zkratka Význam

17 11 DC1 (XOn)

18 12 DC2

19 13 DC3 (XOff)

20 14 DC4

21 15 NAK Negative Acknowledge

22 16 SYN Synchronous Idle

23 17 ETB End of Transmission Block

24 18 CAN Cancel

25 19 EM End of Medium

26 1a SUB Substitute

27 1b ESC Escape

28 1c FS File Separator

29 1d GS Group Separator

30 1e RS Record Separator

31 1f US Unit Separator

Page 5: K ódování  znaků

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

Page 6: K ódování  znaků

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

Page 7: K ódování  znaků

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.“

Page 8: K ódování  znaků

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

Page 9: K ódování  znaků

How Many Different Characters?

a A à á â ã ä å ā ă ą

a a a a a a a a a a a

Page 10: K ódování  znaků

Unicode

• Každému znaku je přiřazen

– název

– číselný kód, tzv. „code point“, např. A je U+0041

• Celkem 1 114 112 znaků s kódy 016 až 10FFFF16

• 17 částí, každý o velikosti 216

• První část = Basic Multilingual Plane (BMP)

– obsahuje znaky běžně používaných abeced

Page 11: K ódování  znaků

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

Page 12: K ódování  znaků

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 min hex max zapsaná posl. bytů ve dvojkové soustavě

0-7 00000000 0000007F 0vvvvvvv

8-11 00000080 000007FF 110vvvvv 10vvvvvv

12-16 00000800 0000FFFF 1110vvvv 10vvvvvv 10vvvvvv

Page 13: K ódování  znaků

UTF-8 příklady

Char. Binary code point Binary UTF-8Hexadecimal UTF-8

$ U+0024 0100100 00100100 24

¢ U+00A2 000 10100010 11000010 10100010 C2 A2

€ U+20AC 00100000 1010110011100010 10000010

10101100E2 82 AC

𤭢 U+24B62 00010 01001011 0110001011110000 10100100 10101101 10100010

F0 A4 AD A2

Page 14: K ódování  znaků

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

Page 15: K ódování  znaků

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 najednou2. LC_kategorie – nastaví konkrétní kategorii3. LANG – použije se, není-li nastavena kategorie

Page 16: K ódování  znaků

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í).

Page 17: K ódování  znaků

Jak nastavit UTF-8

• Příkaz less

– proměnná LESSCHARSET

• hodnota: "utf-8" (místo "ascii", "latin1", ...)

• Perl

– proměnná PERL_UNICODE

• hodnota: SAD

Page 18: K ódování  znaků

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 pole @ARGV 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;

Page 19: K ódování  znaků

Nastavení proměnné prostředí v shellu

• bash:

export VARIABLENAME="value"

setenv VARIABLENAME "value"

• csh/tcsh:

• Zobrazení hodnoty proměnné:

echo $VARIABLENAME

echo $SHELL echo $LC_ALL

bez mezer!

Page 20: K ódování  znaků

Nastavení proměnné prostředí v shellu

• bash:

export LESSCHARSET="utf-8"

setenv LESSCHARSET "utf-8"

• csh/tcsh:

bez mezer!

Page 21: K ódování  znaků

Nastavení locales

• Obecný formát hodnot:

export LC_ALL="cs_CZ.ISO-8859-2"

setenv LC_ALL "cs_CZ.ISO-8859-2"

• csh/tcsh:

jazyk[_teritorium[.znaková_sada]][@modifikátor]

• bash:

• Pro češtinu:

• Nebo alias:

cs_CZ.ISO-8859-2

czech

cs_CZ.UTF-8

de_DE.utf8@euro

Page 22: K ódování  znaků

Další příklady locales

• Obecný formát hodnot:

jazyk[_teritorium[.znaková_sada]][@modifikátor]

• Pro němčinu:

• Pro angličtinu

jich je několik, např: en_US.UTF-8en_NZ.UTF-8

de_DE.utf8@euro

de_DE.UTF-8

de_DE.UTF-8@euro

Page 23: K ódování  znaků

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

Page 24: K ódování  znaků

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.

Page 25: K ódování  znaků

UnicodeTř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

Page 26: K ódování  znaků

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]);

Page 27: K ódování  znaků

Testování souborů

• Otevření souboru může být problematické => testy

-r soubor lze číst-w do souboru lze zapisovat-x soubor je spustitelný-e soubor existuje-f jde o soubor-d jde o adresář-z soubor má nulovou délku-s soubor má nenulovou délku

if(! (–e "soubor")){ open(S,">soubor")}if(-s "vstup" and -r "vstup"){ open(V,"vstup")}

Page 28: K ódování  znaků

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.

Page 29: K ódování  znaků

Čtení ze souboru

Příklad

open(VSTUP,"pearl.txt");

$prom = <VSTUP>; # do $prom se uloží 1. řádek ze souboru "pearl.txt"

my $cislo_radku = 1;while(<VSTUP>) # totéž jako while($_ = <VSTUP>){

print $cislo_radku++, " ", $_;} close VSTUP;

Page 30: K ódování  znaků

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 !!!

Page 31: K ódování  znaků

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";

Page 32: K ódování  znaků

Parametry souboru• Pole @ARGV• 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

Page 33: K ódování  znaků

Příklad s polem @ARGV

foreach $s (@ARGV){ 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 = <VSTUP>) { print VYSTUP $cislo_radku++, " ", $prom; }}

Page 34: K ódování  znaků

Použití @ARGV

• 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

Page 35: K ódování  znaků

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• -n příkaz se obalí cyklem while• -p jako -n, navíc se řádky vytisknou na

STDOUT• -v vypíše verzi Perluperl -pe "s/\r//" W_soubor.txt > U_soubor.txt

perl -ne "print if/aby/"

Page 36: K ódování  znaků

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