Znakové sady textov : smerovanie k UTF-8

Autor: Miroslav Nesrsta | 3.11.2013 o 16:44 | Karma článku: 6,00 | Prečítané:  993x

V článku je k dispozícii spracovanie výsledkov intenzívneho vyhľadávania na internete. V rámci všeobecnej "počítačovej gramotnosti", nezaškodí poznať základy tejto užitočnej i zaujímavej témy, ktorá je aktuálnou najmä pri využívaní i internetových prehliadačov a emailovej komunikácie.

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
10xxxxxx
U-0080 až 07FF 2
11
1110xxxx
10xxxxxx
10xxxxxx
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é

  1. 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.
  2. 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.
  3. 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.
  4. Ď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).
  5. 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.
  6. 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
00100100 24
ä     U+00E4
000 10100010
11000010 10100010
C3 A4
€    U+20AC 00100000 10101100
11100010 10000010 10101100
E2 82 AC

 

Odkazy:

Unicode Characters  http://www.danshort.com/unicode/

Windows-1250         http://en.wikipedia.org/wiki/Windows-1250

 

 

Páčil sa Vám tento článok? Pridajte si blogera medzi obľúbených a my Vám pošleme email keď napíše ďalší článok
Pridaj k obľúbeným

Hlavné správy

PLUS

Kupujúci Japonec? Neexistuje, tvrdia stánkari z vianočných trhov

Strávili sme jeden deň so stánkarmi, aby sme zistili ako vidia návštevníkov spoza svojich pultov.

EKONOMIKA

Deti boháčov majú vlastnú sieť, stojí za ňou Slovák

Byť bohatým je nuda, keď vás nikto nevidí.


Už ste čítali?