> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/cs/clanky-do-hloubky/51-unicode-utf-8-and-multilingual-text-an-introduction.md).

# Unicode, UTF-8 a vícejazyčný text: Úvod

## Unicode a OpenType: znaky a glyfy

Moderní jádra TeXu, tj. XeTeX a LuaTeX, se vyvinula z původního jádra TeXu Donalda Knutha z velké části kvůli potřebě držet krok s vývojem technologického prostředí, zejména Unicode (pro text) a OpenType (pro písma). Dnes lze pomocí balíčků, jako jsou [fontspec](https://ctan.org/pkg/fontspec?lang=en) a [unicode-math](https://ctan.org/pkg/unicode-math?lang=en), mají uživatelé LaTeXu přístup k mimořádně sofistikovaným možnostem sazby, které poskytují písma OpenType — včetně pokročilé vícejazyčné sazby a matematické sazby založené na OpenType ([zavedené společností Microsoft](https://blogs.msdn.microsoft.com/murrays)).

Nicméně, abyste z písem OpenType v XeTeXu/LuaTeXu vytěžili maximum, může být užitečné se seznámit s řadou souvisejících témat a pojmů na pozadí — zejména kvůli řešení problémů nebo jako příprava na pokročilejší a složitější práci. Můžete se například dočíst, že jádra XeTeX a LuaTeX používají „vstup UTF-8“ nebo že jsou „Unicode-aware“, a další čtení o písmech OpenType může probírat nebo zmiňovat témata jako „kódování Unicode“, „fontové funkce“ OpenType, „glyfy“, „ID glyfů“, „názvy glyfů“ a podobně. Naším cílem je poskytnout úvod do těchto termínů a témat a poskládat základní rámec, který ukáže, jak spolu souvisejí a snad i poskytne oporu pro další práci nebo řešení problémů.

Témata, která chceme pokrýt, lze poměrně přehledně rozdělit do dvou hlavních oblastí: *Unicode* která v podstatě patří do světa textu, znaků a textového kódování a *OpenType* jejímž světem jsou písma a glyfy; ale samozřejmě jsou tyto dva světy propojené a už v tomto prvním článku dochází k určitému překryvu.

### O jakých tématech budeme mluvit?

Hlavním zaměřením tohoto článku jsou některá témata související s Unicode: začneme diskusí o tom, co se míní „znakem“, a poté přejdeme k představení písem/jazyků, kódování Unicode a UTF-8 — spolu s příkladem práce s vícejazyčnými textovými soubory. Následující článek naváže na tento text a pokryje témata na pozadí související s technologií písem OpenType. Je zřejmé, že v rámci blogového příspěvku není možné pokusit se o „hloubkový ponor“ do všech oblastí, o nichž doufáme mluvit: naším výslovným cílem je poskytnout celkový rámec ukazující, jak spolu několik klíčových konceptů souvisí a funguje dohromady. Začneme tím nejzákladnějším pojmem: *znaku*.

## Znak: základní stavební kámen

Základní myšlenkou či pojmem, který je v jádru našich úvah (a také v jádru Unicode), je význam slova „znak“: je to jedno z těch slov, jejichž význam se často při každodenní práci a rozhovorech jen „předpokládá“. Z pohledu Unicode, sazby a fontových technologií však musíme být o něco přesnější a definovat, co se rozumí „znakem“. Může nám například připadat naprosto přirozené považovat **a** a *a* za různé „znaky“: ‚tučné a‘ a ‚kurzivní a‘. Jenže ne: jsou to pouze různé vizuální reprezentace téhož základního znaku, který Unicode dává oficiální název [LATINSKÉ MALÉ PÍSMENO A](http://unicode.org/charts/PDF/U0000.pdf).

Unicode [definuje znak](http://www.unicode.org/glossary/#character) jako:

> „Nejmenší součást psaného jazyka, která má sémantickou hodnotu; vztahuje se k abstraktnímu významu a/nebo tvaru, nikoli ke konkrétnímu vzhledu...“

která jasně rozlišuje mezi konkrétním *vizuální podobu* a jeho *významem*.

Na znak můžete nahlížet jako na základní jednotku nebo stavební kámen jazyka, nebo přesněji *skript*—tématem, kterému se věnujeme níže. To, jak znak ve skutečnosti vypadá při zobrazení konkrétním písmem, není pro definici znaku v Unicode relevantní: důležitý je pouze *významem* skutečný zájem zde je: *role a účel* každého znaku jako jedné ze sady stavebních bloků, z nichž jsou nakonec sestavena písma/jazyky.

### Písmo a jazyk

Stojí za to krátce zmínit dva důležité pojmy: *písma* a *jazyky*. Web Unicode poskytuje užitečnou [definici písma](https://www.unicode.org/standard/supported.html):

> „Standard Unicode kóduje písma, nikoli jazyky. Když systémy zápisu pro více než jeden jazyk sdílejí sady grafických symbolů, které mají historicky příbuzný původ, bere se sjednocení všech těchto grafických symbolů jako jedna sbírka znaků pro účely kódování a je identifikováno jako jediné písmo.“

Pomocí [příkladu z Wikipedie](https://en.wikipedia.org/wiki/Script_\(Unicode\)), je latinské písmo tvořeno určitou [sadou znaků](http://unicode.org/charts/) které se používají napříč více jazyky: angličtinou, francouzštinou, němčinou, italštinou a tak dále. Samozřejmě ne všechny znaky definované v rámci latinského písma používají všechny jazyky založené na latinském písmu — například anglická abeceda neobsahuje znaky s diakritikou, které jsou přítomny v jiných evropských jazycích, jako je francouzština nebo němčina.

### Písma OpenType: písma a jazyky

V tomto bodě přejdeme od Unicode k písmům OpenType, protože pojmy písma a jazyka hrají také mimořádně důležitou roli v technologii OpenType.

Sada jazyků, které používají stejné [skript](http://www.unicode.org/glossary/#script) může mít při zobrazení (sazbě) textu psaného v určitém jazyce odlišné typografické tradice. Dobrým příkladem je turecký jazyk a [chování beztečkového i](https://en.wikipedia.org/wiki/Dotted_and_dotless_I) (viz poznámky na této stránce k ligaturám). Typografická „pravidla“ vztahující se k písmům/jazykům jsou zabudována do funkcionality písem OpenType pomocí tzv. script a language *značek* značek, které se používají k identifikaci pravidel, jež by se měla uplatnit pro konkrétní kombinace písma/jazyka. Přirozeně bude sada písem/jazyků podporovaných každým písmem OpenType záviset na rozhodnutích tvůrců písma a na důvodu jeho vzniku. Sofistikovaný sázecí software, jako je XeTeX nebo LuaTeX, může těchto pravidel (zabudovaných v písmech OpenType) využít tím, že uživatelům umožní je selektivně aplikovat na vstupní text při sazbě textu v určitém jazyce — například pomocí balíčku LaTeXu [balíček fontspec](https://ctan.org/pkg/fontspec?lang=en).

#### Pohled dovnitř písma OpenType: písma/jazyky

Aby to bylo jasnější, zde je snímek obrazovky ukazující bezplatné [písmo OpenType Scheherazade](http://software.sil.org/scheherazade/download/) otevřené ve (také bezplatném) [Microsoft VOLT](https://www.microsoft.com/en-us/Typography/volt.aspx) softwaru pro úpravu písem. Na tomto obrázku vidíte písma, jazyky a typografické funkce, které jsou zabudované v písme Scheherazade — pomocí VOLTu můžete do Scheherazade přidat další funkce a možnosti, ale to už je daleko za rámcem tohoto článku!

![Písmo Scheherazade OpenType (ve formátu TrueType) otevřené v Microsoft VOLTu](/files/b5f444c631a18abb3198cf3f674dcd5bdd1c9b22)

Z tohoto snímku je vidět, že Scheherazade podporuje arabské a latinské písmo a poskytuje další specializovanou podporu pro několik jazyků, které používají arabské písmo — pomocí takzvaných funkcí OpenType, které jsou uvedeny ve výše orámovaném zeleném poli. Nebudeme zacházet do podrobností těchto funkcí, ale poselství je, že kvalitní písma OpenType v sobě mají zabudováno mnoho inteligence, připravené k použití sazbovým softwarem, který je schopen využít typografická pravidla zabudovaná do písem.

Zájemce může procházet registr značek OpenType a podívat se na [značky písem](https://www.microsoft.com/typography/otspec/scripttags.htm) a [jazykové značky](https://www.microsoft.com/typography/developers/opentype/languagetags.aspx) aktuálně používané ve specifikaci OpenType.

### Zpět ke znakům: různé role znaků

Sada znaků, která tvoří základní prvky písma (nebo jazyka), nemá všechny stejnou roli. Například ve většině jazyků existují znaky pro *interpunkci*, znaky pro číselné *lichem* stejně jako znaky, které považujeme za *písmena* abecedy, která v některých písmenech existují také ve verzích velkých a malých písmen. Pojem znaku je poměrně široký a standard Unicode zahrnuje specializované znaky, které *nejsou určeny k zobrazení* ale jejich úkolem je „řídit interpretaci nebo zobrazení textu“. Například při sazbě arabského textu můžete chtít vynutit nebo naopak zakázat spojování určitých znaků; standard Unicode k tomu poskytuje speciální řídicí znaky: tzv. [ZERO WIDTH JOINER](https://en.wikipedia.org/wiki/Zero-width_joiner) a [ZERO WIDTH NON-JOINER](https://en.wikipedia.org/wiki/Zero-width_non-joiner). Tyto znaky nejsou určeny ke zobrazení a jsou při zpracování textu softwarem „pohlceny“, aby dosáhly zamýšlených vizuálních účinků.

Všem znakům určeným ve standardu Unicode je přiřazena sada vlastností, která v podstatě popisuje roli a účel každého znaku v kódování Unicode — názvy znaků, jako LATINSKÉ MALÉ PÍSMENO A, jsou jen jedním prvkem seznamu vlastností znaku. Tyto vlastnosti jsou podrobně popsány v [Databázi znaků Unicode (UCD)](http://www.unicode.org/reports/tr44/) a jsou široce používány v počítačovém zpracování textu, například při vyhledávání, třídění, kontrole pravopisu a podobně. Datové soubory uvádějící vlastnosti znaků Unicode jsou také [dostupné ke stažení](http://www.unicode.org/Public/UCD/latest/).

Mezi vlastnostmi přiřazenými každému znaku je pro naše téma nejdůležitější *číselný identifikátor* přiřazený jeho kódováním Unicode, k němuž se nyní obracíme.

### Znaky: čísla a kódování

Je to samozřejmé tvrzení, ale počítače a jiná digitální zařízení pracují s ukládáním a zpracováním číselných dat: jak to tedy souvisí s textem? Když píšete text na počítačové klávesnici nebo ťukáte do obrazovky mobilního zařízení, vaše stisky kláves se přemění na čísla, která představují řetězec znaků, který zadáváte.

V určitém okamžiku budete chtít tento text (sekvenci čísel) přenést prostřednictvím e-mailu, textové zprávy nebo online komunikace, jako je Tweet nebo příspěvek na nějakém druhu sociálních médií. Je zřejmé, že zařízení, na němž jste text vytvořili, a zařízení použitá jeho příjemcem či příjemci, se musí nějak dohodnout, která čísla představují které znaky. Pokud ne, nemusí se váš text na zařízení příjemce zobrazit správně.

Aby dnešní globální komunikace fungovala, potřebují zařízení pro odesílání a přijímání nějakou „vzájemně dohodnutou konvenci“, podle níž určitá sada čísel představuje konkrétní sadu znaků. Této konvenci se říká *kódování*: sada čísel používaná k reprezentaci určité sady znaků a kódování Unicode je nyní *de facto* globálním standardem.

## Unicode: bity a bajty pro ukládání textu

Unicode je obrovský standard, který zahrnuje mnohem, mnohem víc než jen kódování textu, ale zde se soustředíme pouze na kódování, které poskytuje.

#### Bity, bajty a kolik znaků?

Zmínili jsme, že zařízení ukládají a reprezentují text jako čísla — konkrétně znaky budou uloženy jako celá čísla. Abychom pochopili důsledky pro kódování Unicode, potřebujeme *velmi* stručnou, *velmi* základní rekapitulaci toho, jak počítače ukládají celá čísla (nechceme zabíhat do informatiky).

Abychom to zjednodušili, dnešní stolní nebo přenosná zařízení ukládají celá čísla v oddělených „blocích“, které mohou být dlouhé 1, 2, 4 nebo 8 bajtů. Každá z těchto úložných jednotek může ukládat celá čísla až do maximální kladné hodnoty na základě celkového počtu bitů obsažených v každé úložné jednotce:

* 1 bajt (8 bitů): maximální kladné celé číslo je 255;
* 2 bajty (16 bitů): maximální kladné celé číslo je 65535;
* 4 bajty (32 bitů): maximální kladné celé číslo je 4,294,967,295;
* 8 bajtů (64 bitů): maximální kladné celé číslo je 18,446,744,073,709,551,615.

V praxi standard Unicode používá kódování všech znaků světa čísla v rozsahu 0 až 1,114,111, takže k zakódování celého rozsahu potřebuje jen 21 bitů. Můžeme to vidět tak, že úložné jednotky obsahující n bitů mohou reprezentovat libovolné kladné celé číslo od 0 až do maximální hodnoty $$2^n -1$$; proto:

* maximální hodnota, kterou lze uložit do 20 bitů, je $$2^{20} -1 = 1,048,575$$ (příliš malá);
* maximální hodnota, kterou lze uložit do 21 bitů, je $$2^{21} -1 = 2,097,151$$ (dostatečně velká).

Zmínili jsme, že počítače ukládají data (čísla) v jednotkách o velikosti 1, 2, 4 (nebo 8) bajtů, takže jak velká musí být úložná jednotka, pokud musíme ukládat hodnoty až do maximální hodnoty Unicode 1,114,111? Je zřejmé, že úložná jednotka o velikosti bajtu může obsahovat maximální hodnotu 255 a 2 bajty mohou ukládat 65535: ani jedno z toho nestačí pro celý rozsah znaků kódovaných Unicode. Další dostupnou možností jsou úložné jednotky o velikosti 4 bajtů, které mohou ukládat celá čísla až do maximální hodnoty 4,294,967,295, což je mnohem víc, než bychom ve skutečnosti potřebovali. Pokud bychom tedy zvolili jako úložnou jednotku 4 bajty, rozhodně máme více než dost prostoru pro uložení všech hodnot Unicode, přičemž každý znak je uložen jako celé číslo vyžadující 4 bajty (32 bitů). Použití 4 bajtů na všechno je však velmi plýtvavé místem, protože i největší hodnoty Unicode potřebují maximálně 21 bitů — což by při uložení v 32 bitech znamenalo, že 11 z těchto 32 bitů by se nikdy nepoužilo.

**Poznámka**: Přestože rozsah Unicode sahá od 0 do 1,114,111, ne každá hodnota v tomto rozsahu se skutečně používá: z technických důvodů jsou některé hodnoty považovány za neplatné pro skutečné použití jako znaky Unicode.

### Tak co je UTF-8?

Pokud čtete o XeTeXu nebo LuaTeXu, téměř jistě narazíte na vysvětlení, která uvádějí, že tato jádra TeXu čtou textové a vstupní soubory LaTeXu ve „formátu UTF-8“. Co je tedy „formát UTF-8“ a jak souvisí s Unicode? V terminologii Unicode se každá z jeho 1,114,112 hodnot (v rozsahu od 0 do 1,114,111) používaných kódování znaků světa nazývá [kódový bod](http://www.unicode.org/glossary/#code_point).

Viděli jsme, že *teoreticky*bychom museli veškerý text zakódovaný v Unicode ukládat pomocí 4 bajtů na znak, abychom mohli reprezentovat celý rozsah kódových bodů Unicode. V praxi však někteří docela chytří lidé vymysleli jednoduchý způsob, jak reprezentovat jedno číslo Unicode (kódový bod) jako *posloupností* sadu menších čísel, přičemž každé z těchto menších čísel je uloženo v jednom bajtu: proces, který *převádí* jedno (větší) celé číslo na sekvenci menších (bajtově velkých) čísel. Díky této transformaci už znaky v našem textovém souboru nejsou reprezentovány jednotlivou číselnou hodnotou: každý znak se stává *vícebajtovou sekvencí*—jakýkoli textový soubor může pro reprezentaci jednoho jediného znaku Unicode (tj. jeho hodnoty kódového bodu) používat 1 až 4 (po sobě jdoucí) bajty.

UTF znamená *Unicode Transformation Format* a klíčovým slovem zde je *Transformace*. V zásadě si můžete UTF-8 představit jako „recept“ nebo algoritmus pro převod (transformaci) jedné hodnoty kódového bodu Unicode na sekvenci 1 až 4 bajtově velkých částí. S rostoucí hodnotou kódového bodu Unicode roste i počet jednotlivých bajtů potřebných k jeho reprezentaci ve formátu UTF-8.

Pro vytvoření UTF-8 existují technické i historické důvody a příběh o jeho vzniku je [zaznamenán ve fascinujícím e-mailu z roku 2003](https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt), který hned na začátku obsahuje tento řádek:

> „To není pravda. UTF-8 bylo navrženo přede mnou, na podložce v restauraci v New Jersey, jednoho večera někdy v září 1992.“

#### Příklad: arabské písmeno ل

Vezměme si jako příklad arabské písmeno ل (Unicode název ARABIC LETTER LAM), kterému je přiřazena hodnota kódového bodu Unicode 1604 (desítkově) nebo 0644 (šestnáctkově): jeho reprezentace v UTF-8 je *dvoubajtová* sekvence D9 84 (hex) nebo v desítkové soustavě 217 132. Při použití UTF-8 jako formátu pro ukládání textu se tedy místo textového souboru obsahujícího jediné číslo 1604 pro reprezentaci ل převede na dvě hodnoty o velikosti bajtu: 217 a 132 — znak ل je uložen jako *dvoubajtová sekvence*. Čtenáři, kteří chtějí podrobněji prozkoumat algoritmus UTF-8, najdou podrobné vysvětlení i C kód na mém [osobním blogu](http://www.readytext.co.uk/?p=1284).

Když nějaký software (například XeTeX nebo LuaTeX) čte text ve formátu UTF-8, musí tento software určit hodnotu Unicode pro každý znak přítomný v daném souboru, a proto používá algoritmus, který *obrátit* proces transformace UTF-8. Tímto „reverzním algoritmem“ se dvě bajtové hodnoty (217 a 132) znovu spojí a vytvoří celé číslo 1604, které lze poté rozpoznat jako hodnotu kódového bodu Unicode pro arabské písmeno ل.

Takže závěrem: UTF-8 je ve skutečnosti jen meziformát dat používaný pro ukládání a přenos textu kódovaného v Unicode.

**Poznámka**: Některé systémy volí ukládání textu pomocí 32 bitů na znak, tomu se říká [UTF-32](https://en.wikipedia.org/wiki/UTF-32)—existuje také [UTF-16](https://en.wikipedia.org/wiki/UTF-16) ale UTF-8 je nejběžnější způsob ukládání textu kódovaného v Unicode.

## Vícejazyčné soubory TeXu: XeTeX a LuaTeX

XeTeX i LuaTeX dokážou velmi sofistikovaně sázet více jazyků, i když jejich mechanismy k dosažení toho jsou poměrně odlišné a odrážejí návrhovou a vývojovou filozofii každého jádra. Nebudeme to podrobně rozebírat, ale jen poznamenáme, že jádro XeTeX obsahuje softwarové komponenty (zabudované do jeho spustitelného souboru), které v LuaTeXu nejsou přítomny — zejména software pro proces zvaný *OpenType shaping* (např. prostřednictvím knihovny zvané [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)).

LuaTeX naopak přistupuje jinak: místo zabudování funkcí přímo do samotného jádra TeXu poskytuje LuaTeX mimořádně bohatou sadu příkazů (TeXových primitiv) a velmi výkonné [Lua-ové API](/latex/cs/clanky-do-hloubky/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md) prostřednictvím kterého mohou vývojáři vytvářet stejně pokročilá řešení pro vícejazyčnou sazbu. Ačkoli filozofie LuaTeXu může pro autory balíčků LaTeXu znamenat více práce, poskytuje značnou dodatečnou flexibilitu, protože řešení nejsou „natvrdo zakódována“ přímo do samotného jádra LuaTeXu, ale jsou sestavována z kódu TeXu a Lua — nebo z pluginů napsaných v C/C++.

**Poznámka**: Čtenáři, kteří chtějí dál zkoumat fascinující, ale složitý svět OpenType shaping, mohou mít zájem přečíst si o skvělé open-source knihovně zvané [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)—používané mnoha aplikacemi včetně Firefoxu, Chromu a LibreOffice a samozřejmě i XeTeXu. Autor tohoto článku použil HarfBuzz k vytvoření [pluginů LuaTeXu pro sazbu arabštiny](http://www.readytext.co.uk/?p=3186).

V dnešní době je běžné (např. na sociálních médiích) přenášet text, který obsahuje znaky z více jazyků, a textový soubor UTF-8 ukládající vícejazyčný text může snadno obsahovat znaky, jejichž reprezentace v UTF-8 má délku 1, 2, 3 nebo 4 bajty. Ve skutečnosti je tedy textový soubor UTF-8 jen proud jednotlivých bajtů, ale každý skutečný znak v tomto souboru může být libovolně dlouhý od 1 do 4 bajtů: jednotlivé znaky se staly *vícebajtovými sekvencemi*.

Abychom dále prozkoumali některé klíčové aspekty práce s vícejazyčným textem (a jeho sazbou), použijeme příklad obsahující arabské písmo, protože arabština nám dává prostor k řešení více konceptů.

#### Poznámka: arabské písmo

Ta [arabské písmo](https://en.wikipedia.org/wiki/Arabic_script) se píše kurzivním stylem, který se čte i zapisuje zprava doleva. Každé arabské písmeno může potenciálně nabýt jedné ze 4 různých podob podle:

* zda je zobrazeno jako jediný, samostatný (izolovaný) znak (nepřipojený k ničemu dalšímu);
* zda se nachází uvnitř slova — na začátku, uprostřed nebo na konci slova: označuje se jako *počáteční*, *prostřední* a *finální* tvary, resp.

Každý znak arabského písma má vlastní sadu spojovacích pravidel a může, ale nemusí, měnit tvar či vzhled, když má jiný znak nalevo, napravo nebo nalevo i napravo. Čtenáři, kteří by to chtěli dále zkoumat, mohou najít [úplný seznam na Wikipedii](https://en.wikipedia.org/wiki/Template:Arabic_alphabet_shapes/joining).

#### Příklad: arabský a anglický text v UTF-8

Předpokládejme, že vytvoříme textový soubor UTF-8 obsahující jediný řádek anglického a arabského textu: This is العَرَبِيَّة text!

Tento řádek textu obsahuje 3 mezery, 11 anglických znaků (latinské písmo) a 12 arabských znaků (i když to nemusí být hned zřejmé). Po uložení jako textový soubor UTF-8 zabírá 38 bajtů úložiště, což vyplývá z následujícího:

* **latinské písmo**: mezery plus anglický text: 14 × 1bajtových znaků = 14 bajtů;
* **arabské písmo**: 12 arabských znaků × 2 bajty na znak = 24 bajtů.

Celkem 14 + 24 = 38 bajtů.

#### Pojďme hlouběji

Uložíme-li náš ukázkový text do souboru UTF-8 s názvem `arabic.txt` a otevřeme jej v hexadecimálním editoru, můžeme jej prozkoumat a podívat se na skutečné bajty, které obsahuje. Z přiloženého snímku obrazovky níže je vidět, že arabský text je uložen jako 2 bajty na znak:

![Textový soubor UTF-8 obsahující anglický a arabský text otevřený v hexadecimálním editoru.](/files/d0028c8e49e194725921d0653be77cd991845a03)

Textový soubor UTF-8 obsahující anglický a arabský text otevřený v hexadecimálním editoru. Je jasně vidět, že znaky latinského písma vyžadují jeden bajt, zatímco znaky arabského písma jsou uloženy pomocí dvou bajtů na znak.

Ze snímku obrazovky lze vyvodit několik pozorování:

* arabský text je uložen v pořadí zleva doprava a znaky jsou surové, netvarované (izolované) verze arabských písmen a samohlásek;
* za textem latinského písma „This is “ už není žádná další informace, která by jakémukoli softwaru čtoucímu tento soubor sdělila, že následující znak je v arabském písmu.

Pokud sázíte vícejazyčný dokument (např. obsahující angličtinu a arabštinu), pak při čtení a zpracování vstupního textového souboru (jako proudu bajtů) musí XeTeX nebo LuaTeX umět rozpoznat začátek a konec každého znaku a přečíst správný počet bajtů potřebný k obrácení transformace UTF-8 a vygenerování odpovídajícího kódového bodu Unicode. Právě algoritmus UTF-8 samotný umožňuje softwaru to dělat: umožňuje rozpoznat první bajt každého jednotlivého znaku a určit, kolik bajtů je třeba přečíst, aby bylo možné vypočítat odpovídající kódový bod Unicode. UTF-8 se snadno používá, ale je skutečně velmi důmyslné.

#### Logické pořadí, pořadí zobrazení a tvarování OpenType

Pokud se pozorně podíváte na výše uvedenou arabštinu (العَرَبِيَّة), může být obtížné vidět, že náš textový soubor skutečně obsahuje 12 jednotlivých arabských znaků — zvlášť pokud nejste s arabským písmem obeznámeni! Pokud však pečlivě spočítáte arabské znaky zobrazené na pravé straně výše uvedeného snímku obrazovky, uvidíte, že jich je celkem 12.

U jazyků se složitým písmem, jako je arabština, to, co náš textový soubor *ukládá* a co vy *vidíte na obrazovce* je vizuálně *velmi* zcela odlišné! To, co vidíte při zobrazení takového textu například v prohlížeči, je (v závislosti na použitém písmu):

![Obrázek sazebně upraveného arabského textu](/files/a92a2c864bed790d79b38022db6068e39bd792e4)

Jak však ukazuje snímek obrazovky výše, to, co textový soubor UTF-8 ve skutečnosti obsahuje, je toto:

![Obrázek nesazebně upraveného arabského textu (izolované znaky)](/files/6a12b1a44334784277865f4f33b6890c7c9345c0)

I když nejste obeznámeni s kurzivní povahou arabského písma, můžete jasně vidět, že během přenosu arabských znaků obsažených v textovém souboru k sazbě a/nebo zobrazení na obrazovce (jako glyfů) se stalo „něco“. Pokud jste zvyklí používat TeX/LaTeX s jazyky s jednoduchým písmem, například latinkou, může to být skutečně velmi matoucí!

Hrají zde roli některé důležité koncepty, protože textové soubory Unicode ukládají… no, text (Unicode), zatímco sázecí a zobrazovací systémy pracují s písmy a glyfy (OpenType):

* textový soubor uložil arabské znaky v pořadí zleva doprava, ale arabština se čte/zobrazuje zprava doleva: textové soubory ukládají text v tzv. *logickém pořadí*;
* textový soubor obsahuje jednotlivé znaky, které vypadají velmi odlišně od skutečného zobrazení na obrazovce: textový soubor obsahuje arabské znaky v jejich izolované, nespojené podobě.

#### Co se děje?

Uvnitř textového souboru je arabština uložena jako sekvence znaků v izolované podobě zleva doprava: když se nad tím zamyslíte, textový soubor ukládá arabský text v pořadí/sekvenci *v jakém byl napsán* (to *logickém pořadí* ). Je to teprve při zpracování textu pro zobrazení nebo při sazbě, kdy je zobrazen ve správném pořadí čtení, často označovaném jako *vizuální pořadí* nebo *pořadí zobrazení*; navíc jsou izolované podoby arabských znaků *vytvarovány* do typograficky správných verzí pro zobrazení. Jeden způsob, jak o tom přemýšlet, je ten, že jednoduchý textový soubor musí ukládat text (znaky Unicode) v co nejzákladnější možné podobě: jako surové, netvarované, jednotlivé textové znaky — úkolem systémového softwaru je tyto znaky vykreslit pro zobrazení podle dostupného operačního systému, písem a sazebního/zobrazovacího softwaru na zobrazovacím zařízení.

Když je arabský text v daném souboru sázen/zobrazován, prochází procesem zvaným *tvarování*. Jednotlivé arabské znaky jsou převedeny na vytvarované glyfy, které správně reprezentují variantu každého znaku vyžadovanou podle spojovacích pravidel arabského písma a systému zápisu. Kromě toho kvalitní sázecí software (používající dobrá písma OpenType) přidá další zpracování tím, že uplatní dodatečnou typografickou propracovanost prostřednictvím procesu zvaného *OpenType shaping*—proces zahrnující širokou škálu typografických operací, mezi něž může patřit:

* nahrazování více jednotlivých glyfů jedním složitým ligaturním glyfem (velmi běžné u arabštiny), nebo
* poziční operace, které například upravují polohu arabských samohlásek podle toho, nad nebo pod kterým glyfem se nacházejí.

![Obrázek ukazující transformaci, kterou arabský text prochází při sazbě](/files/652c25ca4bba0596eacb04989357ee600f6be349)

Rozdíl mezi logickým pořadím a vizuálním (zobrazovacím) pořadím. V tomto obrázku můžete vidět, že arabské znaky uložené v textovém souboru procházejí při zobrazení nebo sazbě přeuspořádáním a tvarováním.

Designéři a tvůrci pokročilých písem OpenType věnují značné množství času a odborných znalostí tomu, aby do svých písem zabudovali sofistikované typografické možnosti.

Chceme-li vypnout tvarování aplikované na arabský text, můžeme použít vynikající, bezplatný, [BabelPad](http://www.babelstone.co.uk/Software/BabelPad.html) Unicode textový editor (pouze pro Windows), který vám umožní vypnout tvarování a zobrazit syrové, jednotlivé nespojené (netvarované) znaky, které jsou ve skutečnosti přítomny v textovém souboru — viz spodní polovina tohoto kombinovaného snímku obrazovky:

![Obrázek ukazující schopnost textového editoru BabelPad vypnout tvarování OpenType](/files/13d9c26b1ec6d3ac53f610cd1db9e437630bd2c1)

Použití Unicode textového editoru BabelPad k zapnutí tvarování OpenType (horní obrázek) nebo jeho vypnutí (dolní obrázek). Vypnutí tvarování OpenType výrazně usnadňuje úpravy arabského textu.

Pojmy logické pořadí a pořadí zobrazení v kombinaci s procesy tvarování mohou být při prvním setkání při úpravách nebo sazbě vícejazyčných textových souborů obsahujících složité písma, jako je arabština, poměrně matoucí: doufejme, že výše uvedené pomohlo vyhnout se počátečním nejasnostem.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/cs/clanky-do-hloubky/51-unicode-utf-8-and-multilingual-text-an-introduction.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
