Úvod do Unicode a UTF-8

  • Skripty
  • Letadla
  • Jednotky kódu
  • Grafy
  • Glyfy
  • Sekvence
  • Normalizace
  • Emodži
  • Prvních 128 znaků
  • Kódování Unicode
    • UTF-8
    • UTF-16
    • UTF-32

Unicode je průmyslový standard pro konzistentní kódování psaného textu .

Existuje mnoho znakových sad, které používají počítače, ale Unicode je první svého druhu, která se zaměřuje na podporu každého jednotlivého psaného jazyka na světě (i mimo něj!).

Jeho cílem je poskytnout jedinečné číslo pro identifikaci každého znaku pro každý jazyk a na jakékoli platformě.

Unicode mapuje každý znak na konkrétní kód, který se nazývá bod kódu . Bod kódu má tvar U+<hex-code> , v rozsahu od U+0000 do U+10FFFF .

Příklad kódu vypadá takto:U+004F . Jeho význam závisí na použitém kódování znaků.

Unicode definuje různá kódování znaků , nejpoužívanější jsou UTF-8, UTF-16 a UTF-32.

UTF-8 je rozhodně nejoblíbenější kódování v rodině Unicode, zejména na webu. Tento dokument je napsán například v UTF-8.

V současné době je implementováno více než 135 000 různých znaků s prostorem pro více než 1,1 milionu.

Skripty

Všechny znaky podporované Unicode jsou seskupeny do sekcí zvaných skripty .

Pro každou jinou znakovou sadu existuje skript:

  • Latinka (obsahuje všechna ASCII + všechny ostatní znaky západního světa)
  • korejština
  • Stará maďarština
  • hebrejština
  • řecky
  • arménština
  • …a tak dále!

Úplný seznam je definován v normě ISO 15924.

Další informace o skriptech:https://en.wikipedia.org/wiki/Script_(Unicode)

Letadla

Kromě skriptů existuje další způsob, jak Unicode organizuje své znaky:roviny .

Namísto jejich seskupování podle typu kontroluje bodovou hodnotu kódu:

Letadlo Rozsah
0 U+0000 – U+FFFF
1 U+10000 – U+1FFFF
2 U+20000 – U+2FFFF
14 U+E0000 – U+EFFFF
15 U+F0000 – U+FFFFF
16 U+100000 – U+10FFFF

Je tu 17 letadel.

První je speciální, jmenuje se Základní vícejazyčná rovina nebo BMP a obsahuje většinu moderních znaků a symbolů z latinky, azbuky a řeckého písma.

Dalších 16 rovin se nazývá astrální roviny . Stojí za zmínku, že letadla 3 až 13 jsou momentálně prázdná.

Kódové body obsažené v astrálních rovinách se nazývají astrální kódové body .

Body astrálního kódu jsou všechny body vyšší než U+10000 .

Kódové jednotky

Body kódu jsou interně uloženy jako jednotky kódu . Kódová jednotka je bitová reprezentace znaku a její délka se liší v závislosti na kódování znaků

UTF-32 používá 32bitovou kódovou jednotku.

UTF-8 používá 8bitovou kódovou jednotku a UTF-16 používá 16bitovou kódovou jednotku. Pokud kódový bod potřebuje větší velikost, bude reprezentován 2 (nebo více, v UTF-8) kódovými jednotkami.

Grafémy

Grafém je symbol, který představuje jednotku systému písma. Je to v podstatě váš nápad postavy a jak by měla vypadat.

Glyfy

Glyf je grafické znázornění grafému:jak je vizuálně zobrazen na obrazovce, skutečný vzhled na displeji.

Sekvence

Unicode vám umožňuje kombinovat různé znaky a vytvořit grafém.

Jde například o znaky s diakritikou:písmeno é lze vyjádřit pomocí kombinace písmene e (U+0065 ) a znak Unicode s názvem „COMBINING ACUTE ACCENT“ (U+0301 ):

"U+0065U+0301" ➡️ "é"

U+0301 v tomto případě je to, co je popsáno jako kombinační značka , jeden znak, který se vztahuje k předchozímu a tvoří jiný grafém.

Normalizace

Znaky mohou být někdy reprezentovány pomocí různých kombinací bodů kódu.

Jde například o znaky s diakritikou:písmeno é lze vyjádřit jak U+00E9 a také jako kombinaci e (U+0065 ) a znak Unicode s názvem „COMBINING ACUTE ACCENT“ (U+0301 ):

U+00E9       ➡️ "é"
U+0065U+0301 ➡️ "é"

Proces normalizace analyzuje řetězec pro tyto druhy nejednoznačností a vygeneruje řetězec s kanonickou reprezentací jakéhokoli znaku.

Bez normalizace budou dokonale stejné struny pro oko považovány za odlišné, protože se změní jejich vnitřní reprezentace:

Emodži

Emoji jsou znaky astrální roviny Unicode a poskytují způsob, jak mít obrázky na obrazovce, aniž by byly skutečné obrázky, pouze glyfy písem.

Například symbol 🐶 je zakódován jako U+1F436 .

Prvních 128 znaků

Prvních 128 znaků Unicode je stejných jako znaková sada ASCII.

Prvních 32 znaků, U+0000 -U+001F (0-31) se nazývají Řídicí kódy .

Jsou dědictvím z minulosti a většina z nich je dnes již zastaralá. Používaly se pro dálnopisy, něco, co existovalo před faxem.

Znaky od U+0020 (32) do U+007E (126) obsahují čísla, písmena a některé symboly:

Unicode kód ASCII Glyph
U+0020 32 (mezera)
U+0021 33 !
U+0022 34
U+0023 35 #
U+0024 36 $
U+0025 37 %
U+0026 38 &
U+0027 39 '
U+0028 40 (
U+0029 41 )
U+002A 42 *
U+002B 43 +
U+002C 44 ,
U+002D 45 -
U+002E 46 .
U+002F 47 /
U+0030 48 0
U+0031 49 1
U+0032 50 2
U+0033 51 3
U+0034 52 4
U+0035 53 5
U+0036 54 6
U+0037 55 7
U+0038 56 8
U+0039 57 9
U+003A 58 :
U+003B 59 ;
U+003C 60 <
U+003D 61 =
U+003E 62 >
U+003F 63 ?
U+0040 64 @
U+0041 65 A
U+0042 66 B
U+0043 67 C
U+0044 68 D
U+0045 69 E
U+0046 70 F
U+0047 71 G
U+0048 72 H
U+0049 73
U+004A 74 J
U+004B 75 K
U+004C 76 L
U+004D 77 M
U+004E 78 N
U+004F 79 O
U+0050 80 P
U+0051 81 O
U+0052 82 R
U+0053 83 S
U+0054 84 T
U+0055 85 U
U+0056 86 V
U+0057 87 W
U+0058 88 X
U+0059 89 Y
U+005A 90 Z
U+005B 91 [
U+005C 92 \
U+005D 93 ]
U+005E 94 ^
U+005F 95
U+0060 96 `
U+0061 97 a
U+0062 98 b
U+0063 99 c
U+0064 100 d
U+0065 101 e
U+0066 102 f
U+0067 103 g
U+0068 104 h
U+0069 105 i
U+006A 106 j
U+006B 107 k
U+006C 108 l
U+006D 109 m
U+006E 110 n
U+006F 111 o
U+0070 112 p
U+0071 113 q
U+0072 114 r
U+0073 115 s
U+0074 116 t
U+0075 117 u
U+0076 118 v
U+0077 119 w
U+0078 120 x
U+0079 121 y
U+007A 122 z
U+007B 123
U+007C 124
U+007D 125 }
U+007E 126 ~
  • Čísla začínají od U+0030 na U+0039
  • Velká písmena začínají od U+0041 na U+005A
  • Malá písmena začínají od U+0061 na U+007A

U+007F (127) je znak pro odstranění.

Vše, co bude v budoucnu, je mimo oblast ASCII a je součástí výhradně Unicode.

Celý seznam najdete na Wikipedii:https://en.wikipedia.org/wiki/List_of_Unicode_characters

Kódování Unicode

UTF-8

UTF-8 je kódování znaků s proměnnou šířkou a dokáže zakódovat každý znak pokrytý Unicode pomocí 1 až 4 8bitových bajtů.

Původně jej navrhli Ken Thompson a Rob Pike v roce 1992. Tato jména jsou známá těm, kteří se zajímají o programovací jazyk Go, protože to byli také dva původní tvůrci.

Doporučuje jej W3C jako výchozí kódování v souborech HTML a statistiky ukazují, že se k dubnu 2018 používá na 91,3 % všech webových stránek.

V době svého zavedení bylo ASCII nejoblíbenějším kódováním znaků v západním světě. V ASCII bylo všem písmenům, číslicím a symbolům přiřazeno číslo a toto číslo. Protože byl pevně nastaven na 8 bitů, mohl reprezentovat maximálně 255 znaků a to stačilo.

UTF-8 bylo navrženo tak, aby bylo zpětně kompatibilní s ASCII. To bylo velmi důležité pro jeho přijetí, protože ASCII bylo mnohem starší (1963) a rozšířené a přechod na UTF-8 byl téměř transparentní.

Prvních 128 znaků UTF-8 mapuje přesně na ASCII. Proč 128? Protože ASCII používá 7bitové kódování, které umožňuje až 128 kombinací. Proč 7 bitů? Nyní považujeme 8 bitů za samozřejmost, ale v době, kdy bylo vytvořeno ASCII, byly populární také 7bitové systémy.

Díky 100% kompatibilitě s ASCII je UTF-8 také velmi efektivní, protože nejčastěji používané znaky v západních jazycích jsou kódovány pouze 1 byte.

Zde je mapa využití bajtů:

Počet bajtů Začátek Konec
1 U+0000 U+007F
2 U+0080 U+07FF
3 U+0800 U+FFFF
4 U+10000 U+10FFFF

Pamatujete si, že v ASCII byly znaky kódovány jako čísla? Pokud je písmeno A v ASCII byl reprezentován číslem 65 , pomocí UTF-8 je kódován jako U+0041 .

Proč ne U+0065 ptáš se? No protože unicode používá hexadecimální základ a místo 10 máte U+000A a tak dále (v podstatě máte sadu 16 číslic místo 10)

Podívejte se na toto video, které brilantně vysvětluje tuto kompatibilitu UTF-8 a ASCII.

UTF-16

UTF-16 je další velmi populární kódování Unicode. Například Java interně reprezentuje jakoukoli postavu. Je to také jedno ze 2 kódování, které JavaScript používá interně, spolu s UCS-2 . Používá jej také mnoho dalších systémů, například Windows.

UTF-16 je systém kódování s proměnnou délkou, jako UTF-8, ale používá 2 bajty (16 bitů) jako minimum pro jakoukoli reprezentaci znaků. Jako takový je zpětně nekompatibilní se standardem ASCII.

Kódové body v základní vícejazyčné rovině (BMP) jsou uloženy pomocí 2 bajtů. Kódové body v astrálních rovinách jsou uloženy pomocí 4 bajtů.

UTF-32

UTF-8 používá minimálně 1 bajt, UTF-16 používá minimálně 2 bajty.

UTF-32 vždy používá 4 bajty, bez optimalizace pro využití prostoru, a jako takové plýtvá velkým množstvím šířky pásma.

Toto omezení umožňuje rychlejší ovládání, protože máte méně ke kontrole, protože můžete předpokládat 4 bajty pro všechny znaky.

Není tak populární jako UTF-8 a UTF-16, ale má své aplikace.