Unicode

Unicode je medzinárodný štandard, ktorého cieľom je definovať kódovaciu schému schopnú reprezentovať väčšinu znakov používaných v písaných jazykoch spolu s inými symbolmi.

Napriek technickým problémom, obmedzeniam a kritike sa zo štandardu Unicode stala dominantná kódovacia schéma používaná pri internacionalizácii softvéru a viacjazyčných prostredí.

Operačné systémy Microsoft Windows NT a odvodené verzie Windows 2000 a Windows XP používajú Unicode, presnejšie UTF-16, na internú reprezentáciu textu.
Operačné systémy UNIXového typu ako GNU/Linux, BSD a Mac OS X prijali Unicode, presnejšie UTF-8, ako základ pre reprezentáciu viacjazyčného textu.

Unicode je štandard pre univerzálne kódovanie znakov pre počítače. Toto kódovanie navrhla nezisková organizácia s názvom The Unicode Consortium, ktorej cieľom bolo vytvoriť jednotnú sadu znakov UCS (Universal Character Set), ktorá by nahradila množstvo rozdielnych sád znakov používaných v jednotlivých krajinách. Tento štandard publikovala v knihe The Unicode Standard. Okrem znakovej sady, ktorá bola tiež normalizovaná ako ISO/IEC 10646, dokument obsahuje i ďalšie veci súvisiace s počítačovým písmom (spôsob dekompozície, vykresľovania, metódy kódovania…). Tento štandard bol implementovaný do moderných operačných systémov a jeho modifikácia UTF (Unicode Transformation Format) je implementovaná v jazykoch XML a Java.

Vývoj štandardu 
Vznik jednotného kódu znakov podmienila existencia množstva znakových sád. Znakové sady sa líšili nielen pre jednotlivé krajiny, ale i v rámci jednej z krajín existovalo viacero znakových sád. Všetky znakové sady boli navrhnuté na základe americkej normy ASCII, ktorá pevne určovala prvých 128 znakov sady a zvyšných 128 sa líšilo v závislosti od krajiny. Na Slovensku sa najčastejšie používali (a ešte stále používajú) kódy ISO 8859-2, známy tiež ako Latin-2 alebo CP 852, ktorý definovala medzinárodná organizácia ISO, ďalej kód ANSI 1250, známy tiež ako Windows 1250, definovaný americkou organizáciou, ale najčastejšie používaný bol kód Kamenických, známy tiež ako CP 895, ktorý nebol štandardizovaný. Podobné to bolo i v iných krajinách. Celý problém bol v tom, že kód ASCII bol navrhnutý tak, že jednému znaku zodpovedal jeden bajt. Takéto kódovanie umožňovalo vytvárať sady s 256 znakmi. Kódovanie Unicode je navrhnuté pomocou dvoj-bajtového a troj-bajtového kódovania znakov, čo umožňuje kódovať oveľa viac znakov. Štandard je navrhnutý tak, že všetky možné znaky rozdeľuje do sedemnástich dvoj-bajtových rovín s poradovými číslami od 0 po 16 (hexadecimálne od 00 po 10). Každá z týchto rovín teda kóduje 216 = 65 536 znakov. Takéto rozdelenie umožňuje definovať až  17 × 216 = 1 114 112 znakov. Poradové čísla znakov sa v Unicode označujú hexadecimálne U+hhhhhh, kde prvá hodnota "hh" značí rovinu a druhá hodnota "hhhh" značí poradie v príslušnej rovine. Limit 17 rovín bol zvolený kvôli UTF-16 kódovaniu Unicode, keďže to dokáže kódovať iba 220 znakov (16 rovín) + nultú rovinu, zatiaľco UTF-8 aj s obmedzením na 4 bajty dokáže kódovať 221 znakov (až 32 rovín). Roviny sú následne rozdelené do tzv. blokov, logicky usporiadaných celkov (znakových sád), ktoré na rozdiel od rovín nemajú pevnú veľkosť. Prvá verzia štandardu – Unicode 1.0.0 – vznikla v októbri 1991, súčasná verzia štandardu je už Unicode 10.0 z roku 2017. Táto definuje viac ako 136 tisíc znakov, čo je približne iba 12 % zo všetkých možných. Unicode 10.0 obsahuje 280 blokov (rozprestrených cez niektoré roviny) pokrývajúcich až 25% adresného priestoru pre 1 114 112 znakov (bloky tak nemajú priradené a vyčerpané všetky pozície). Najmenšie bloky majú iba 16 znakov (v Unicode 10.0 je takých až 13 blokov) a najväčšie bloky obsahujú 65 536 znakov, sú to celé roviny s poradovými číslami 15 a 16.

Problémy s UNICODE 
Pôvodná koncepcia bola taká, že každému znaku bude priradená dvojbajtová hodnota, ktorá bude znak reprezentovať v pamäti počítača. Takéto kódovanie však vytváralo niekoľko problémov. Niektoré systémy boli navrhnuté tak, že z pamäte sa najskôr spracovával vyšší bajt a potom nižší a u iných systémov to bolo opačne. Na niektorých systémoch preto začali ukladať bajty v opačnom poradí, čo spôsobilo to, že po prenose textu z jedného systému na druhý bol text nečitateľný (pozri Endianita). Problém vyriešili tým, že na začiatok každého dokumentu vložili informáciu BOM (Byte Order Mark) o tom, v akom poradí sú uložené bajty reprezentujúce text. Takéto kódovanie sa dnes označuje skratkou UCS-2.

Ďalším problémom bola nekompatibilita so staršími systémami, ktoré používali kódovanie ASCII. Tento problém čiastočne rieši kódovanie UTF s premenlivou bitovou dĺžkou. Toto kódovanie kóduje prvých 128 znakov zhodne s ASCII tabuľkou. Líšiť sa začína až ďalšími znakmi, ktoré sa kódujú viac ako 8 bitmi.

V súčasnosti sa používajú tieto spôsoby kódovania:
 UTF-7 — nepopulárne 7-bitové kódovanie, považuje sa za zastarané
 UTF-8 — 8-bitové kódovanie s premenlivou bitovou dĺžkou, ktoré je čiastočne kompatibilné s ASCII
 UCS-2 — 16-bitové kódovanie s pevnou dĺžkou, ktoré však podporuje len prvú zo 17 rovín, tzv. BMP (Basic Multilingual Plane)
 UTF-16 — 16-bitové kódovanie s premenlivou dĺžkou
 UCS-4 alebo UTF-32 — 32-bitové kódovanie s pevnou bitovou dĺžkou
 UTF-EBCDIC — kódovanie pre systémy EBCDI od firmy IBM

Bloky Unicode 
 Základná latinka, ASCII (0000–007F)
 Doplnok základnej latinky, štandardizované extended ACSII (0080–00FF)
 Rozšírenie latinky A (0100–017F)
 Rozšírenie latinky B (0180–024F)
 Medzinárodná fonetická abeceda (0250–02AF)
 Medzerové písmená (02B0–02FF)
 Kombinačné diakritické značky (0300–036F)
 Grécka abeceda a koptské rozšírenie (0370–03FF)
 Cyrilika (0400–04FF)
 Doplnok cyriliky (0500–052F)
 Arménska abeceda (0530–058F)
 Hebrejská abeceda (0590–05FF)
 Arabské písmo (0600–06FF)
 Sýrska abeceda (0700–074F)
 Thaana (0780–07BF)
 Dévanágarí (0900–097F)
 Bengálska abeceda (0980–09FF)
 Gurmukhi abeceda (0A00–0A7F)
 Gudžarátska abeceda (0A80–0AFF)
 Uríjska abeceda (0B00–0B7F)
 Tamilská abeceda (0B80–0BFF)
 Telugská abeceda (0C00–0C7F)
 Kannadská abeceda (0C80–0CFF)
 Malajálamska abeceda (0D00–0D7F)
 Sinhalská abeceda (0D80–0DFF)
 Thajská abeceda (0E00–0E7F)
 Laoská abeceda (0E80–0EFF)
 Tibetské písmo (0F00–0FFF)
 Barmská abeceda (1000–109F)
 Gruzínska abeceda (10A0–10FF)
 Hangul Jamo (1100–11FF)
 Etiópska abeceda (1200–137F)
 Cherokee abeceda (13A0–13FF)
 Jednotné kanadské domorodé slabiky (1400–167F)
 Ogam (1680–169F)
 Runy (16A0–16FF)
 Tagalog (1700–171F)
 Hanunoo (1720–173F)
 Buhid (1740–175F)
 Tagbanwa (1760–177F)
 Khmérska abeceda (1780–17FF)
 Mongolská abeceda (1800–18AF)
 Limbu (1900–194F)
 Tai Le (1950–197F)
 Khmérske symboly (19E0–19FF)
 Fonetické rozšírenia (1D00–1D7F)
 Dodatok rozšírenej latinky (1E00–1EFF)
 Rozšírenie gréckej abecedy (1F00–1FFF)
 Všeobecné interpunkčné znamienka (2000–206F)
 Superskripty a subskripty (2070–209F)
 Symboly peňažných mien (20A0–20CF)
 Kombinačné diakritické značky pre symboly (20D0–20FF)
 Písmové symboly (2100–214F)
 Číselné formy (2150–218F)
 Šípky (2190–21FF)
 Matematické operátory (2200–22FF)
 Rôzne technické znaky (2300–23FF)
 Riadiace obrázky (2400–243F)
 Znaky pre optické rozpoznávanie (2440–245F)
 Uzavreté alfanumerické znaky (2460–24FF)
 Kreslenie čiar (2500–257F)
 Blokové prvky (2580–259F)
 Geometrické tvary (25A0–25FF)
 Rôzne symboly (2600–26FF)
 Dingbaty (2700–27BF)
 Rôzne matematické symboly A (27C0–27EF)
 Doplňujúce šípky A (27F0–27FF)
 Braillovo písmo (2800–28FF)
 Doplňujúce šípky B (2900–297F)
 Rôzne matematické symboly B (2980–29FF)
 Doplňujúce matematické operátory (2A00–2AFF)
 Rôzne symboly a šípky (2B00–2BFF)
 Koptská abeceda (2C80–2CFF)
 Doplnok CJK radikálov (2E80–2EFF)
 Kangxi radikály (2F00–2FDF)
 Ideografické popisné znaky (2FF0–2FFF)
 CJK symboly a interpunkčné značky (3000–303F)
 Hiragana (3040–309F)
 Katakana (30A0–30FF)
 Bopomofo (3100–312F)
 Hangul kompatibilné Jamo znaky (3130–318F)
 Kanbun znaky (3190–319F)
 Rozšírenie Bopomofo (31A0–31BF)
 Katakana fonetické rozšírenia (31F0–31FF)
 Uzavreté CJK písmená a mesiace (3200–32FF)
 CJK kompatibilné (3300–33FF)
 CJK jednotné ideografické rozšírenia A (3400–4DBF)
 I-ťing hexagramové symboly (4DC0–4DFF)
 CJK jednotné ideogramy (4E00–9FFF)
 Slabiky ioštiny (A000–A48F)
 Radikály ioštiny (A490–A4CF)
 Hangul slabiky (AC00–D7AF)
 Oblasť pre súkromné použitie (E000–F8FF)
 CJK kompatibilné ideogramy (F900–FAFF)
 Abecedné prezentačné formy (FB00–FB4F)
 Arabské prezentačné formy A (FB50–FDFF)
 Variačné selektory (FE00–FE0F)
 Kombinačné poloznačky (FE20–FE2F)
 CJK kompatibilné formy (FE30–FE4F)
 Malé varianty foriem (FE50–FE6F)
 Arabské prezentačné formy B (FE70–FEFF)
 Pološiroké a plnoširoké formy (FF00–FFEF)
 Špeciálne (FFF0–FFFF)
 Slabičné znaky lineárneho písma B (10000–1007F)
 Ideogramy lineárneho písma B (10080–100FF)
 Egejské čísla (10100–1013F)
 Starogrécke čísla (10140–1018F)
 Staroveké symboly (10190–101CF)
 Znaky Disku z Faistu (101D0–101FF)
 Lýkijská abeceda (10280–1029F)
 Kárska abeceda (102A0–102DF)
 Staroitalická abeceda (10300–1032F)
 Gótská abeceda (10330–1034F)
 Ugarská abeceda (10380–1039F)
 Deseretská abeceda (10400–1044F)
 Showova abeceda (10450–1047F)
 Somálska abeceda (10480–104AF)
 Cyperská slabičná abeceda (10800–1083F)
 Byzantské hudobné symboly (1D000–1D0FF)
 Hudobné symboly (1D100–1D1FF)
 Tai-Xuan-Jing symboly (1D300–1D35F)
 Matematické alfanumerické symboly (1D400–1D7FF)
 CJK jednotné ideografické rozšírenia B (20000–2A6DF)
 Doplnok kompatibilných ideogramov CJK (2F800–2FA1F)
 Značky (E0000–E007F)
 Doplnok rôznych selektorov (E0100–E01EF)
 Doplňujúca oblasť na súkromné použitie A (F0000–FFFFF)
 Doplňujúca oblasť na súkromné použitie B (100000–10FFFD)

História revízií Unicode 

 Unicode 1.0 (1991)
 Unicode 1.1 (1993)
 Unicode 2.0 (1996)
 Unicode 2.1 (1998)
 Unicode 3.0 (1999, 2000)
 Unicode 3.1 (2001)
 Unicode 3.2 (2002)
 Unicode 4.0 (2003)
 Unicode 4.1 (2005)
 Unicode 5.0 (2006)
 Unicode 5.1 (2008)

 Unicode 5.2 (2009)
 Unicode 6.0 (2010)
 Unicode 6.1 (2012)
 Unicode 6.2 (2012)
 Unicode 6.3 (2013)
 Unicode 7.0 (2014)
 Unicode 8.0 (2015)
 Unicode 9.0 (2016)
 Unicode 10.0 (2017)
 Unicode 11.0 (2018)
 Unicode 12.0 (2019)

Externé odkazy 
 Oficiálna stránka Konzorcia Unicode
 
Gramatológia

Kódovanie znakov