Počítač pracuje interne len s číslami, dané číslo je vyjadrené kombináciou bitov. Každý bit môže nadobúdať hodnotu 1 (true) alebo 0 (false). Každý znak v textovom súbore je reprezentovaný kombináciou bitov, ktoré dokopy tvoria číslo v dvojkovej (binárnej) sústave. Aby počítačový program (prehliadač, textový editor...) vedel, ako má bity v do textového súboru ukladať a naopak ich zasa interpretovať, musí poznať
znakovú sadu a
kódovanie znakov
Znaková sada (character set / charset)
Znaková sada obsahuje znaky a ich kódy.
Najjednoduchšou a najdlhšie známou znakovou sadou je štandard ASCII - The American Standard Code for Information Interchange. Je to kódovací algoritmus znakov, pôvodne založený na anglickej abecede, ktorý kóduje 128 špecifikovaných znakov: číslá 0-9, písmená a-z a A-Z, niektoré základné interpunkčné symboly, niektoré riadiace kódy a znak medzery, do 7-bit binárnych čísiel. Kódy ASCII representujú text v počítačoch, komunikačných zariadeniach a ďalších zariadeniach, ktoré používajú text. Obsahuje znaky s číslami pozícií v sade 0 až 127, spolu 128. To však postačuje len pre angličtinu. Ostatné jazyky tu nemajú miesto pre svoje špecifické znaky, ako sú najmä písmená s diakritickými znamienkami.
Preto vzniklo niekoľko 8 bitových (1 bajtových, bajt / byte = 8 bitov) znakových sád, ktoré obsahujú až 28 = 256 znakov. Prvých 128 znakov a ich kódov je zhodných s ASCII, druhá polovica sady obsahuje špecifické znaky pre daný jazyk.
Takto vznikla napr. sada pre západoeurópske jazyky (ISO 8859-1, označovaná aj ako ISO Latin 1) alebo stredoeurópske jazyky (ISO 8859-2 alebo ISO Latin 2); sem patrí aj slovenčina a čeština. Tieto znakové sady sú štandardizované organizáciou ISO (International Standard Organisation). Okrem toho ešte Microsoft zaviedol vlastné verzie týchto sád, ktoré sa používajú vo Windows; pre stredoeurópske jazyky je to sada windows-1250. Tieto sady sú takmer rovnaké ako sady ISO uvedené vyššie, no niektoré znaky majú na odlišných pozíciách.
Kódovanie znakov (character encoding)
Znaková sada definuje priradenie konkrétnych znakov k ich kódom.
Pre danú znakovú sadu kódovanie určuje, ako je pozícia znaku v znakovej sade konvertovaná na sekvenciu bitov.
Unicode a UCS
Ani rozšírené 8-bitové znakové sady s kapacitou 256 znakov nie sú celkom vyhovujúcim riešením, pretože v nich a) nie je v nich dosť miesta pre niektoré jazyky, b) nie je možné v jednom súbore použiť znaky viac ako jedného jazyka.
Preto vznikli znakové sady, v ktorých je dostatok miesta pre všetky znaky všetkých používaných jazykov. Ku koncu osemdesiatych rokov 20. storočia vznikla naliehavá potreba zjednotiť rôzne kódové tabuľky znakov pre národné abecedy.
V tom čase vznikli súčasne dva projekty pre vytvorenie univerzálnej kódovacej tabuľky znakov. Bol to projekt ISO 10646 organizácie ISO (International Standard Organisation) a projekt Unicode.
Norma ISO definuje tzv. UCS (Universal Character Set / Univerzálna sada znakov).
UCS obsahuje všetky znaky všetkých kódovaní znakových sád. Navyše garantuje kompatibilitu spätnej konverzie, teda je možné zostaviť konverzné tabuľky tak, aby nedochádzalo ku strate informácie pri konverzii z iného kódovania do UCS a nazad.
Štandard Unicode definuje numerickú hodnotu a názov pre každý zo svojich znakov.
Rieši zásadný problém globálnej výmeny informácií - jednoznačný zápis spôsobom, ktorý zabezpečí konzistenciu a bezproblémové používanie. Roku 1991 bolo, po niekoľkých rokoch neformálnej spolupráce, založené Unicode Consorcium, s cieľom usilovať sa o zavedenie a další vývoj 16 bitového kódovania pre znaky nejdôležitejších svetových jazykov, spolu s veľa historickými a archaickými znakmi. Výsledkem jeho práce je standard Unicode, ktorý sa stal tiež súčasťou širšieho štandardu ISO 10646.
Kódový priestor Unicode je rozdelený do 17 skupín (planes), číslovaných od 0 do 16:
plane 0: Basic Multilingual Plane BMP, 0000-FFFF
plane 1: Supplementary Multilingual Plane SMP, 10000-1FFFF
- - -
planes 15-16: Supplementary Private Use Area SPUA A/B, F0000-10FFFF
Prvá skupina „0" nazvaná Basic Multilingual Plane (BMP), obsahuje znaky pre takmer všetky moderné jazyky ako aj množstvo špeciálnych znakov.
Doplnkové skupiny obsahujú len exotické znaky pre osobitné vedecké použitie, publikovanie, vysokoúrovňové protokoly a pod.
Znaková sada Unicode môže byť implementovaná viacerými systémami kódovania znakov. V súčasnosti, najpoužívanejším kódovaním je systém UTF-8, ktorý znaky kóduje do dvoch až šiestich bajtov, pričom všetky používajú hodnotu pozície v sade znakov nad 127 - nie je ich teda možné zameniť so znakmi ASCII.
V r. 1991 došlo k dohode a projekty Unicode a UCS spojili svoje úsilie na vytvorenie jednotnej tabuľky. Oba projekty stále existujú a publikujú svoje štandardy samostatne, ale tabuľky znakov sú kompatibilné.
V obidvoch systémoch, kódovanie pre znaky mezi 0x0000 a 0x007F je zhodné so základnou sadou ASCII a znaky medzi 0x0000 a 0x00FF sú zhodné so sadou ISO 8859-1 / Latin-1.
Unicode má aj niekoľko nevýhod a to:
- 256× väčšia znaková sada: pokiaľ uvážime, že vo veľa jazykoch sa využije jen malá časť z celkového množstva, tak znaky zbytočne zaberajú miesto.
- nezlučiteľnosť s 8-bit prostredím: Unicode text môže mať znaky, ktoré v "normálnom", 8-bit texte normálne nie sú a väčšinou majú špeciálny význam. Nedá sa teda použiť stávajúci programový kód pre práci s textom. Nejde ľahko zistiť, či text je v Unicode alebo nie, nedá sa preto ľahko používať Unicode a nejaké ďalšie 8-bit kódovanie. Nie je možné prejsť na Unicode len sčasti, je nutný celkový prechod, aby aplikácie nielen dostali text v Unicode, ale aby Unicode text i očakávali.
Kódovací algoritmus UTF-8
Pôvodná špecifikácia pre UTF-8 definovala kapacitu až do 6 bajtov formátu. V novembri 2003 bola táto kapacita štandardom RFC 3629 obmedzená.
Odvtedy už 5- a 6-bajtové sekvencie nie sú využívané.
Pre znaky stredoeurópskeho typu navyše celkom postačuje kapacita kódu s max. 3 bajtami, pre názornosť je tu kódovací algoritmus UTF-8 vysvetlený len pre tento rozsah.
Nasledujúca tabuľka ukazuje formát sekvencií bajtov UTF-8.
UTF-8 formát | Unicode (hex) | UTF-8 bajtov | UTF-8 bitov |
0xxxxxxx | U-0000 až 007F | 1 | 7 |
110xxxxx | U-0080 až 07FF | 2 | 11 |
1110xxxx | U-0800 až FFFF | 3 | 16 |
Kódové pozície Unicode s indexom vyšším ako 127 (dec) resp. 007F (hex) , sú v UTF-8 reprezentované viac-bajtovými sekvenciami, zloženými z
LB vedúci / prvý bajt (Leading Byte)
CB1, CB2 jeden alebo viac ďalších bajtov (Continuation Byte).
Skelet formátu UTF-8 pre sekvenciu LB + CB1 je ukázaný v 2. riadku tabuľky.
Skelet formátu UTF-8 pre sekvenciu LB + CB1 + CB2 je ukázaný v 3. riadku tabuľky.
Poznámka: MSB Most Significant Bit / Bit s najvyššou váhou
Charakteristické vlastnosti algoritmu UTF-8 sú nasledovné
Jedno-bajtové kódy sú použité len pre hodnoty ASCII v rozsahu 0 až 127. V tomto prípade, UTF-8 kód má tú istú hodnotu ako kód ASCII.
Kódové pozície vyššie ako 127 sú reprezentované viac bajtovými sekvenciami, zloženými z prvého bajtu LB a jedného alebo viac ďalších bajtov CB.
Prvý bajt LB má v pozíciách MSB bitov dve alebo viac "1", nasledovaných "0". Počet týchto bitov "1" určuje počet bajtov v sekvencii UTF-8.
Ďalšie bajty CB1 a CB2 majú v pozíciách MSB "10". Takto, kapacita každého CB je 10000000 až 10111111 (bin), resp. 0x80 až 0xBF (hex).
Skelety pre sekvenciu LB + CB1 a pre LB + CB1+CB2 majú, ako ukazuje tabuľka, na pozíciách bitov MSB hodnotu "1" alebo "0". Tieto fixne určené "služobné" bity formátu kódovania UTF-8 nevstupujú do určovania hodnoty kódu znaku.
Bity znázornené v tabuľke symbolmi „x" slúžia k vlastnému účelu určovania hodnoty kódu znaku. Bity vyššieho rádu idú do LB bajtu, bity nižšieho rádu do nasledujúcich CB bajtov. Počet bajtov v kódovaní je určený ako minimálne potrebný pre umiestnenie všetkých platných bitov, prislúchajúcich danej kódovej pozícii.
Poznámka:
Ak uvidíme v nejakej aplikácii čudný text ("rozsypaný čaj" ...), kde sa budú vyskytovať znaky alebo dvojice znakov ako
á ä ÄŤ ÄŹ Ă© Ă Äľ Äş Ĺ^ Ăł Ă´ Ĺ• š ĹĄ Ăş Ă˝ Ĺľ ,
znamená to zvyčajne, že si súbor uložený v kódovaniu UTF-8 prezeráme pomocou programu, ktorý nevie vykonať správne dekódovanie sekvencií bajtov UTF-8 nazad na Unicode prvky a tieto znaky následne zobraziť.
Príklady kódovania UTF-8:
Znak Unicode (symbol € pre euro) je U+20AC. Podľa tabuľky algoritmizácie vyššie, znak zaberie pre zakódovanie tri bajty, lebo jeho pozícia je medzi U+0800 a U+FFFF.
U+20AC (hex) je 0010 0000 1010 1100 (bin).
Keďže je to troj-bajtové kódovanie, prvý bajt začína tromi 1 nasledovanými 0 (1110 ... )
Ak umiestnime 16 bitov príslušných U+20AC do 16 pozícií "x", dostaneme UTF-8 zakódovanie znaku ako: 11100010 1000010 10101100.
Pre bity "x"prvého bajtu sú prevzaté prvé 4 bity znaku € U+20AC (11100010), ponechávajúc 0000 1010 1100 pre ďalšie bajty sekvencie.
Každý z ďalších dvoch bajtov začína 10 a preberá šesť bitov znaku € U+20AC (10000010 druhý bajt, potom 10101100 tretí bajt).
Túto konverziu sumarizuje nasledovná tabuľka, spolu s doplnením i pre znaky $ a ä.
Farby indikujú, ako sú bity z kódovej pozície distribuované medzi bajty UTF-8.
Bity, doplnené v procese kódovania UTF-8, sú ukázané v čiernej farbe.
znak | kód Unicode | kód UTF-8 (bin) | kód UTF-8 (hex) |
$ U+0024 | 0100100 | 0100100 | 24 |
ä U+00E4 | 000 10 100010 | 110 00010 10 100010 | C3 A4 |
€ U+20AC | 0010 0000 10 101100 | 1110 0010 10 000010 10 101100 | E2 82 AC |
Odkazy:
Unicode Characters http://www.danshort.com/unicode/
Windows-1250 http://en.wikipedia.org/wiki/Windows-1250