> 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/uk/dokladni-statti/51-unicode-utf-8-and-multilingual-text-an-introduction.md).

# Unicode, UTF-8 і багатомовний текст: вступ

## Unicode і OpenType: символи та гліфи

Сучасні механізми TeX, тобто XeTeX і LuaTeX, еволюціонували від оригінального механізму TeX Кнута значною мірою через потребу йти в ногу з розвитком технологічного ландшафту, зокрема Unicode (для тексту) та OpenType (для шрифтів). Сьогодні, завдяки використанню пакетів на кшталт [fontspec](https://ctan.org/pkg/fontspec?lang=en) та [unicode-math](https://ctan.org/pkg/unicode-math?lang=en), користувачі LaTeX можуть отримати доступ до надзвичайно складних можливостей верстки, які надають шрифти OpenType, — зокрема, до передової багатомовної верстки та математичної верстки на основі OpenType ([уперше запропоновані Microsoft](https://blogs.msdn.microsoft.com/murrays)).

Однак, щоб максимально використати шрифти OpenType з XeTeX/LuaTeX, корисно ознайомитися з низкою фонових тем/понять — особливо для розв’язання проблем або щоб прокласти шлях до більш просунутої/складної роботи. Наприклад, ви можете прочитати про те, що механізми XeTeX і LuaTeX використовують «ввід UTF-8» або що вони «підтримують Unicode», а подальше читання про шрифти OpenType може обговорювати або згадувати такі теми, як «кодування Unicode», «функції шрифту» OpenType, «гліфи», «ID гліфів», «назви гліфів» тощо. Наша мета — подати вступ до цих термінів/тем і скласти базову схему, щоб показати, як вони пов’язані, і, сподіваємося, надати підтримку для подальшої роботи або вирішення проблем.

Теми, які ми прагнемо охопити, досить чітко поділяються на дві основні сфери: *Unicode* яка, по суті, населяє світ тексту/символів і кодування тексту, і *OpenType* чий світ — це світ шрифтів і гліфів; але, звісно, ці два світи взаємопов’язані, і є певне перетинання, навіть у цій першій статті.

### Які теми ми будемо обговорювати?

Основна увага цієї статті зосереджена на деяких темах, пов’язаних із Unicode: починаючи з обговорення того, що мається на увазі під «символом», і переходячи до введення писемностей/мов, кодування Unicode та UTF-8 — разом із прикладом роботи з багатомовними текстовими файлами. Наступна стаття розвине цю частину й охопить фонові теми, пов’язані з технологією шрифтів OpenType. Очевидно, в межах блогу неможливо спробувати «глибоке занурення» в усі сфери, про які ми сподіваємося поговорити: наша заявлена мета — подати загальну схему, що показує, як кілька ключових понять пов’язані між собою та працюють разом. Почнемо з найосновнішого поняття: *символа*.

## Символ: базовий будівельний блок

Фундаментальна ідея/поняття, яке лежить в основі наших обговорень (і Unicode), — це значення «символу»: це одне з тих слів, значення яких часто «припускають» у повсякденній роботі та розмовах. Однак із погляду Unicode, верстки та технологій шрифтів, нам потрібно бути трохи точнішими й визначити, що мається на увазі під «символом». Наприклад, для нас може бути цілком природно вважати **a** та *a* як різні «символи»: «жирна a» і «курсивна a». Але ні: це лише різні візуальні представлення одного й того ж фундаментального символу, якому Unicode надає офіційну назву [МАЛА ЛАТИНСЬКА ЛІТЕРА A](http://unicode.org/charts/PDF/U0000.pdf).

Unicode [визначає символ](http://www.unicode.org/glossary/#character) як:

> «Найменша складова писемної мови, що має семантичну цінність; стосується абстрактного значення та/або форми, а не конкретної форми...»

що чітко розрізняє специфічну *зовнішньому вигляді* і його *форму*.

Ви можете думати про символ як про фундаментальну одиницю або будівельний блок мови або, точніше,  *писем*—тему, яку ми обговорюємо нижче. Те, як символ насправді виглядає під час відображення певним шрифтом, не має значення для визначення символу в Unicode: лише  *форму* є тут справді важливим:  *роль і призначення* кожного символу як одного з набору будівельних блоків, з яких зрештою будуються писемності/мови.

### Писемність і мова

Варто коротко згадати два важливі поняття: *писемності* та *мов*. На сайті Unicode є корисне [визначення писемності](https://www.unicode.org/standard/supported.html):

> «Стандарт Unicode кодує писемності, а не мови. Коли системи письма для більш ніж однієї мови використовують набори графічних символів, що історично мають споріднене походження, об’єднання всіх цих графічних символів розглядається як єдина колекція символів для кодування і визначається як одна писемність.»

Використовуючи  [приклад із Вікіпедії](https://en.wikipedia.org/wiki/Script_\(Unicode\)), латинська писемність складається з певної [колекції символів](http://unicode.org/charts/) які використовуються в кількох мовах: англійській, французькій, німецькій, італійській тощо. Звісно, не всі символи, визначені в межах латинської писемності, використовуються всіма мовами, що ґрунтуються на латинській писемності — наприклад, англійський алфавіт не містить символів із діакритиками, присутніх в інших європейських мовах, таких як французька чи німецька.

### Шрифти OpenType: писемності та мови

На цьому етапі ми перейдемо від Unicode до шрифтів OpenType, оскільки поняття писемності та мови також відіграють надзвичайно важливу роль у технології шрифтів OpenType.

Набір мов, які використовують ту саму [писем](http://www.unicode.org/glossary/#script) може мати різні типографські традиції, коли йдеться про відображення (верстку) тексту, написаного певною мовою. Гарний приклад — турецька мова та [поведінка літери i без крапки](https://en.wikipedia.org/wiki/Dotted_and_dotless_I) (див. примітки на тій сторінці щодо лігатур). Типографські «правила», пов’язані з писемностями/мовами, вбудовані у функціональність шрифтів OpenType завдяки так званим інструкціям для писемностей і мов *тегів* які використовуються для визначення правил, що мають застосовуватися до певних комбінацій писемність/мова. Природно, набір писемностей/мов, які підтримує кожен шрифт OpenType, буде різнитися залежно від рішень, ухвалених творцями шрифту, і причини його створення. Складне програмне забезпечення для верстки, таке як XeTeX або LuaTeX, може скористатися цими правилами (вбудованими в шрифти OpenType), дозволяючи користувачам вибірково застосовувати їх до вхідного тексту під час верстки тексту певною мовою — наприклад, за допомогою пакета LaTeX [пакет fontspec](https://ctan.org/pkg/fontspec?lang=en).

#### Погляд усередину шрифту OpenType: писемності/мови

Щоб це було ще зрозуміліше, ось знімок екрана, що показує безплатний [шрифт OpenType Scheherazade](http://software.sil.org/scheherazade/download/) відкритий у (також безплатному) [Microsoft VOLT](https://www.microsoft.com/en-us/Typography/volt.aspx) програмному забезпеченні для редагування шрифтів. На цьому зображенні ви можете побачити писемності, мови та типографські функції, вбудовані в Scheherazade — за допомогою VOLT ви можете додати до Scheherazade додаткові функції та можливості, але це вже далеко за межами цієї статті!

![Шрифт Scheherazade OpenType (варіант TrueType), відкритий у Microsoft VOLT](/files/ddc00394867f43a13ba894b65b90fbcec34e6917)

З цього знімка екрана видно, що Scheherazade підтримує арабську та латинську писемності й надає додаткову спеціалізовану підтримку для кількох мов, які використовують арабську писемність — за допомогою так званих функцій OpenType, перелічених у полі з зеленою рамкою вище. Ми не будемо заглиблюватися в специфіку цих функцій, але суть тут у тому, що високоякісні шрифти OpenType мають у собі вбудовано багато інтелекту, готового до використання програмним забезпеченням для верстки, здатним скористатися типографськими правилами, вбудованими у шрифти.

Зацікавлений читач може переглянути реєстр тегів OpenType, щоб побачити [теги писемностей](https://www.microsoft.com/typography/otspec/scripttags.htm) та [теги мов](https://www.microsoft.com/typography/developers/opentype/languagetags.aspx) які наразі використовуються в специфікації OpenType.

### Назад до символів: різні ролі символів

Набір символів, що становлять фундаментальні елементи писемності (або мови), не всі виконують одну й ту саму роль. Наприклад, у більшості мов є символи для *розділових знаків*, символи для числових *цифр* а також символи, які ми сприймаємо як *літери* алфавіту, який для деяких писемностей також має форми великих і малих літер. Поняття символу досить широке, і Стандарт Unicode включає спеціальні символи, які *не призначені для відображення* але чиє завдання — «керувати інтерпретацією або відображенням тексту». Наприклад, під час верстки арабського тексту ви можете захотіти примусити або заборонити з’єднувальну поведінку певних символів; стандарт Unicode надає для цього спеціальні керувальні символи: так звані [ZERO WIDTH JOINER](https://en.wikipedia.org/wiki/Zero-width_joiner) та [ZERO WIDTH NON-JOINER](https://en.wikipedia.org/wiki/Zero-width_non-joiner). Ці символи не призначені для відображення і «поглинаються» програмним забезпеченням під час обробки тексту, щоб створити їхній задуманий візуальний ефект.

Усі символи, визначені стандартом Unicode, отримують набір властивостей, який, по суті, описує роль і призначення кожного символу в кодуванні Unicode — назви символів, такі як МАЛА ЛАТИНСЬКА ЛІТЕРА A, є лише одним елементом списку властивостей символу. Ці властивості повністю описані в [Базі даних символів Unicode (UCD)](http://www.unicode.org/reports/tr44/) і широко використовуються в комп’ютеризованих операціях обробки тексту, таких як пошук, сортування, перевірка правопису тощо. Файли даних, що містять перелік властивостей символів Unicode, також [доступні для завантаження](http://www.unicode.org/Public/UCD/latest/).

Серед властивостей, присвоєних кожному символу, найважливішою для нашого обговорення є *числовий ідентифікатор* присвоєний його кодуванням Unicode, до якого ми зараз і перейдемо.

### Символи: числа та кодування

Це очевидно, але комп’ютери та інші цифрові пристрої займаються зберіганням і обробкою числових даних: тож як це пов’язано з текстом? Коли ви вводите текст за допомогою комп’ютерної клавіатури або торкаєтесь екрана мобільного пристрою, ваші натискання клавіш перетворюються на числа, що представляють рядок символів, який ви вводите.

У певний момент ви можете захотіти передати цей текст (послідовність чисел) через електронну пошту, текстове повідомлення або через онлайн-зв’язок, наприклад твітом чи дописом у якійсь соціальній мережі. Очевидно, пристрій, на якому ви створили текст, і пристрій/пристрої, якими користується його отримувач(і), мають, так чи інакше, погодитися, які числа представляють які символи. Якщо ні, ваш текст може не відобразитися коректно на пристрої отримувача.

Для роботи сучасних глобальних комунікацій пристрої відправника та отримувача потребують певної «взаємно узгодженої конвенції», за допомогою якої певний набір чисел представляє певний набір символів. Ця конвенція називається *кодування*: набір чисел, що використовується для представлення певного набору символів, а кодування Unicode тепер є *de facto* глобальним стандартом.

## Unicode: біти та байти для зберігання тексту

Unicode — це величезний стандарт, який охоплює набагато, набагато більше, ніж лише кодування тексту, але тут ми зосереджуємося тільки на кодуванні, яке він надає.

#### Біти, байти та скільки символів?

Ми згадували, що пристрої зберігають і подають текст як числа — точніше, символи зберігатимуться як цілі числа: цілі числа. Щоб зрозуміти наслідки цього для кодування Unicode, нам потрібно мати *дуже* короткий, *дуже* базовий огляд того, як комп’ютери зберігають цілі числа (ми не маємо наміру занурюватися в інформатику).

Якщо дуже коротко, сучасні настільні або портативні пристрої зберігають цілі числа в окремих «блоках», які можуть мати довжину 1, 2, 4 або 8 байтів. Кожен із цих блоків пам’яті може зберігати цілі числа до певного максимального додатного значення, що залежить від загальної кількості бітів, які містяться в кожному блоці:

* 1 байт (8 бітів): максимальне додатне ціле число — 255;
* 2 байти (16 бітів): максимальне додатне ціле число — 65535;
* 4 байти (32 біти): максимальне додатне ціле число — 4,294,967,295;
* 8 байтів (64 біти): максимальне додатне ціле число — 18,446,744,073,709,551,615.

На практиці стандарт Unicode використовує числа в діапазоні від 0 до 1,114,111 для кодування всіх символів світу, тож для кодування повного діапазону йому потрібно лише 21 біт. Ми можемо побачити це, зазначивши, що блоки пам’яті, які містять n бітів, можуть представляти будь-яке додатне ціле число від 0 до максимального значення $$2^n -1$$; отже:

* максимальне значення, яке можна зберегти в 20 бітах, — це $$2^{20} -1 = 1,048,575$$ (замало);
* максимальне значення, яке можна зберегти в 21 біті, — це $$2^{21} -1 = 2,097,151$$ (достатньо велике).

Ми зазначили, що комп’ютери зберігають дані (числа) в одиницях по 1, 2, 4 (або 8) байтів, тож яким має бути розмір блока пам’яті, якщо нам потрібно зберігати значення аж до максимального значення Unicode 1,114,111? Очевидно, блок розміром в один байт може містити максимальне значення 255, а 2 байти можуть зберігати 65535: жодного з цих варіантів недостатньо для зберігання повного діапазону символів, закодованих Unicode. Наступний доступний варіант — блоки пам’яті розміром 4 байти, які можуть зберігати цілі числа до максимального значення 4,294,967,295, що набагато більше, ніж нам насправді потрібно. Тож, якби ми обрали 4 байти як наш блок пам’яті, у нас, безумовно, було б більш ніж достатньо місця для зберігання всіх значень Unicode, причому кожен символ зберігався б як ціле число, що потребує 4 байти (32 біти). Однак використання 4 байтів для зберігання всього — це дуже марнотратне витрачання місця, оскільки навіть найбільші значення Unicode потребують максимум 21 біт — а якби їх зберігати в 32 бітах, це означало б, що 11 із цих 32 бітів ніколи не використовувалися б.

**Примітка**: Хоча діапазон Unicode охоплює значення від 0 до 1,114,111, не кожне значення в цьому діапазоні фактично використовується: з технічних причин деякі значення вважаються недійсними для реального використання як символи Unicode.

### Тож що таке UTF-8?

Якщо ви читаєте про XeTeX або LuaTeX, ви майже напевно натрапите на пояснення, у яких стверджується, що ці механізми TeX читають текст і вхідні файли LaTeX у «форматі UTF-8». Тож що таке «формат UTF-8» і як він пов’язаний із Unicode? У термінології Unicode кожне з його 1,114,112 значень (від 0 до 1,114,111), що використовуються для кодування символів світу, називається [кодова позиція](http://www.unicode.org/glossary/#code_point).

Ми бачили, що *теоретично*, нам потрібно було б зберігати весь наш текст, закодований Unicode, використовуючи 4 байти на символ, щоб подати повний діапазон кодових точок Unicode. Однак на практиці деякі досить розумні люди винайшли простий спосіб представляти одне число Unicode (кодову точку) як *послідовністю* із менших чисел, і кожне з цих менших чисел зберігається в одному байті: процес, який *перетворює* одне (більше) ціле число в послідовність менших (байтового розміру). Через це перетворення символи нашого текстового файла вже не представлені кожен одним числовим значенням: кожен символ стає *багатобайтовою послідовністю*—будь-які від 1 до 4 (послідовних) байтів у текстовому файлі можуть представляти один окремий символ Unicode (тобто значення його кодової точки).

UTF розшифровується як *Формат перетворення Unicode* і ключове слово тут — *Перетворення*. По суті, UTF-8 можна вважати «рецептом» або алгоритмом для перетворення (трансформації) одного значення кодової точки Unicode в послідовність із 1 до 4 частин байтового розміру. У міру збільшення значення кодової точки Unicode зростає й кількість окремих байтів, потрібних для його представлення у форматі UTF-8.

Існують технічні та історичні причини створення UTF-8, а історія винаходу UTF-8 [зафіксована в захопливому електронному листі 2003 року](https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt), який, ближче до початку листа, містить рядок:

> «Це неправда. UTF-8 було спроєктовано прямо на моїх очах на серветці в закусочній у Нью-Джерсі однієї ночі у вересні або близько того 1992 року.»

#### Приклад: арабська літера ل

Візьмімо приклад арабської літери ل (Unicode-ім’я ARABIC LETTER LAM), якій призначено значення кодової точки Unicode 1604 (десяткове) або 0644 (шістнадцяткове): її представлення в UTF-8 — це *двобайтову* послідовність D9 84 (шістнадцяткове) або, у десятковому вигляді, 217 132. Якщо використовувати UTF-8 як формат для зберігання тексту, то замість текстового файла, що містить одне число 1604 для представлення ل, воно перетворюється на два байтові значення: 217 і 132 — символ ل зберігається як *двобайтову послідовність*. Читачі, які хочуть детальніше дослідити алгоритм UTF-8, можуть знайти докладне пояснення та код C у мене на [особистому блозі](http://www.readytext.co.uk/?p=1284).

Коли програмне забезпечення (наприклад, XeTeX або LuaTeX) читає текст у форматі UTF-8, йому потрібно визначити значення Unicode для кожного символу, наявного в цьому файлі, тож воно використовує алгоритм, щоб *повернути* процесу перетворення UTF-8. Завдяки цьому «алгоритму зворотного перетворення» два байти (217 і 132) об’єднуються, щоб утворити ціле число 1604, яке потім можна розпізнати як значення кодової точки Unicode для арабської літери ل.

Отже, підсумовуючи, UTF-8 — це лише проміжний формат даних, що використовується для зберігання та передавання тексту, закодованого Unicode.

**Примітка**: Деякі системи обирають використовувати/зберігати текст, застосовуючи 32 біти на символ, це називається [UTF-32](https://en.wikipedia.org/wiki/UTF-32)—існує також [UTF-16](https://en.wikipedia.org/wiki/UTF-16) але UTF-8 є найпоширенішим способом зберігання тексту, закодованого Unicode.

## Багатомовні файли TeX: XeTeX і LuaTeX

І XeTeX, і LuaTeX здатні виконувати дуже складну багатомовну верстку, хоча їхні механізми досягнення цього досить різні й відображають філософію проєктування/розробки кожного механізму. Ми не будемо детально це досліджувати, а просто зазначимо, що механізм XeTeX містить програмні компоненти (вбудовані в його виконуваний файл), яких немає в LuaTeX — найпомітніше програмне забезпечення для процесу, який називається *формування OpenType* (наприклад, через бібліотеку під назвою [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)).

LuaTeX, навпаки, обирає інший підхід: замість того, щоб вбудовувати засоби безпосередньо в сам механізм TeX, LuaTeX надає надзвичайно багату колекцію команд (примітивів TeX) і дуже потужний [API на основі Lua](/latex/uk/dokladni-statti/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md) через який розробники можуть створювати настільки ж просунуті рішення для багатомовної верстки. Хоча філософія LuaTeX може означати додаткову роботу для розробників пакетів LaTeX, вона забезпечує значно більшу гнучкість, оскільки рішення не «зашиті» безпосередньо в сам механізм LuaTeX, а створюються з коду TeX і Lua — або плагінів, написаних мовами C/C++.

**Примітка**: Читачам, які хочуть далі дослідити захопливий, але складний світ формування OpenType, може бути цікаво прочитати про чудову бібліотеку з відкритим кодом під назвою [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)—яку використовують багато застосунків, зокрема Firefox, Chrome і LibreOffice, і, звісно, XeTeX. Автор цієї статті використовував HarfBuzz для створення [плагінів LuaTeX для арабської верстки](http://www.readytext.co.uk/?p=3186).

Нині стало звичним (наприклад, у соціальних мережах) передавати текст, що містить символи з кількох мов, і текстовий файл UTF-8, який зберігає багатомовний текст, легко може містити символи, представлення яких у UTF-8 має довжину 1, 2, 3 або 4 байти. Тож, по суті, текстовий файл UTF-8 — це просто потік окремих байтів, але кожен фактичний символ у цьому файлі може мати довжину від 1 до 4 байтів: окремі символи стали *багатобайтовими послідовностями*.

Щоб далі дослідити деякі ключові аспекти роботи з багатомовним текстом (для верстки), ми використаємо приклад, що містить арабську писемність, оскільки арабська дає нам простір для розгляду кількох понять.

#### Примітка: арабська писемність

Функція [Арабська писемність](https://en.wikipedia.org/wiki/Arabic_script) пишеться курсивним стилем, який читається і пишеться справа наліво. Кожна арабська літера потенційно може набувати однієї з 4 різних форм залежно від:

* того, чи вона відображається як окремий, самостійний (ізольований) символ (не з’єднаний ні з чим іншим);
* того, чи вона трапляється всередині слова — на початку, в середині чи в кінці слова: це називають *початковою*, *середньою* та *кінцевий* формами відповідно.

Кожен символ арабської писемності має власний набір правил з’єднання і може змінювати або не змінювати форму/вигляд, коли ліворуч, праворуч або з обох боків від нього є інший символ. Читачі, які хочуть далі дослідити це, можуть знайти [повний список у Вікіпедії](https://en.wikipedia.org/wiki/Template:Arabic_alphabet_shapes/joining).

#### Приклад: арабський та англійський текст у UTF-8

Припустімо, ми створюємо текстовий файл UTF-8, що містить один рядок англійського й арабського тексту: This is العَرَبِيَّة text!

У цьому рядку тексту міститься 3 пробіли, 11 англійських (латинська писемність) символів і 12 арабських символів (хоча це може бути не одразу очевидно). Якщо зберегти його як текстовий файл UTF-8, він займає 38 байтів пам’яті, що є результатом такого:

* **Латинська писемність**: пробіли плюс англійський текст: 14 ✕ 1-байтових символів = 14 байтів;
* **Арабська писемність**: 12 арабських символів ✕ 2 байти на символ = 24 байти.

Разом 14 + 24 = 38 байтів.

#### Поглиблюючись далі

Якщо ми збережемо наш приклад тексту у файлі UTF-8 під назвою `arabic.txt` і відкриємо його у шістнадцятковому редакторі, то зможемо його вивчити, щоб побачити фактичні байти, які він містить. Із розгляду наведеного нижче анотованого знімка екрана видно, що арабський текст зберігається як 2 байти на символ:

![Текстовий файл UTF-8, що містить англійський та арабський текст, відкритий у шістнадцятковому редакторі.](/files/5fe1f583bdcef252ca36ed2cbbdaf0d88945aa25)

Текстовий файл UTF-8, що містить англійський та арабський текст, відкритий у шістнадцятковому редакторі. Ви чітко бачите, що символи латинської писемності потребують одного байта, а символи арабської писемності зберігаються, використовуючи два байти на символ.

З цього знімка екрана можна зробити кілька спостережень:

* арабський текст зберігається в послідовності справа наліво, а символи — це сирі, не сформовані (ізольовані) версії арабських літер і голосних;
* після латинського тексту «This is » немає додаткової інформації, яка б повідомляла будь-якому програмному забезпеченню, що читає цей файл, що наступний символ належить до арабської писемності.

Якщо ви верстаєте багатомовний документ (наприклад, що містить англійську та арабську мови), то під час читання/обробки вхідного текстового файла (як потоку байтів) XeTeX або LuaTeX мають бути здатними визначити початок і кінець кожного символу та прочитати правильну кількість байтів, потрібну для зворотного перетворення UTF-8 і генерації відповідної кодової точки Unicode. Саме алгоритм UTF-8 дає програмному забезпеченню змогу робити це: визначати перший байт кожного окремого символу і скільки байтів потрібно прочитати, щоб обчислити відповідну кодову точку Unicode. UTF-8 простий у використанні, але справді дуже винахідливий.

#### Логічний порядок, порядок відображення та формування OpenType

Якщо уважно придивитися до арабського тексту вище (العَرَبِيَّة), може бути важко побачити, що наш текстовий файл справді містить 12 окремих арабських символів — особливо якщо ви не знайомі з арабською писемністю! Однак, якщо уважно порахувати арабські символи, показані в правій частині знімка екрана вище, можна побачити, що їх усього 12.

Для мов зі складною писемністю, як-от арабська, те, що наш текстовий файл *зберігає* і те, що ви *бачите на екрані* насправді візуально *дуже* різниться! Те, що ви бачите, коли переглядаєте такий текст, скажімо, у браузері, — це (залежно від використаного шрифту):

![Зображення арабського тексту у верстці](/files/c4d5111760ba2dcba65e84552f1a349860b4e22e)

Але, як показує знімок екрана вище, те, що фактично містить текстовий файл UTF-8, — це ось що:

![Зображення арабського тексту без верстки (ізольовані символи)](/files/111f890d7c1716bc211a371f9dc5bc634f124170)

Навіть якщо ви не знайомі з курсивною природою арабської писемності, ви чітко бачите, що під час передавання арабських символів, що містяться в текстовому файлі, до етапу верстки та/або відображення на екрані (як гліфи) «щось» сталося. Якщо ви звикли використовувати TeX/LaTeX із мовами простої писемності, наприклад мовами на латинській основі, це справді може бути дуже заплутано!

Тут задіяні деякі важливі поняття, оскільки текстові файли Unicode займаються зберіганням… ну, тексту (Unicode), а системи верстки та відображення — використанням шрифтів і гліфів (OpenType):

* текстовий файл зберіг арабські символи в порядку зліва направо, але арабська читається/відображається справа наліво: текстові файли зберігають текст у так званому *логічному порядку*;
* текстовий файл містить окремі символи, які дуже відрізняються від фактичного відображення, представленого на екрані: текстовий файл містить арабські символи в їхній ізольованій, нез’єднаній формі.

#### Що відбувається?

У текстовому файлі арабська мова зберігається як послідовність ізольованих форм символів, розташована зліва направо: якщо подумати, текстовий файл зберігає арабський текст у порядку/послідовності *у якій було введено* (the *логічному порядку*). Лише тоді, коли цей текст обробляється для відображення або верстається, він відображається в правильному порядку читання, який часто називають *візуальним порядком* або *порядком відображення*; крім того, ізольовані форми арабських символів *формуються* у їхні типографськи правильні версії для відображення. Один зі способів це уявити — що простий текстовий файл має зберігати текст (символи Unicode) у найпростіший можливий спосіб: як сирі, не сформовані, окремі текстові символи — завдання системного програмного забезпечення полягає в тому, щоб відобразити ці символи на екрані на основі операційної системи, шрифтів і програмного забезпечення для верстки/рендерингу, доступних на пристрої відображення.

Коли арабський текст у цьому файлі верстається/відображається, він проходить процес, який називається *формування*. Окремі арабські символи перетворюються на сформовані гліфи, які правильно передають варіант кожного символу, необхідний відповідно до правил з’єднання арабської писемності та системи письма. Крім того, високоякісне програмне забезпечення для верстки (з хорошими шрифтами OpenType) додатково обробляє текст, застосовуючи додаткову типографську складність через процес, який називається *формування OpenType*— процес, який охоплює широкий спектр типографських операцій, які можуть включати:

* заміщення кількох окремих гліфів одним складним лігатурним гліфом (дуже поширено в арабській), або
* операції розміщення, які, наприклад, коригують положення арабських голосних залежно від того, над чи під яким гліфом вони розташовані.

![Зображення, що показує трансформацію, яку зазнає арабський текст під час набору](/files/98b59e29fa3eecda8abdf69f43381ceaffd37fa7)

Різниця між логічним порядком і візуальним (екранним) порядком. На цій графіці ви можете побачити, що арабські символи, збережені у текстовому файлі, під час відображення або набору проходять перестановку та формоутворення.

Автори та розробники просунутих шрифтів OpenType вкладають дуже значні час і фахові знання, щоб забезпечити складні типографські можливості, вбудовані в їхні шрифти.

Щоб вимкнути формоутворення, яке застосовується до арабського тексту, ми можемо скористатися чудовим, безкоштовним, [BabelPad](http://www.babelstone.co.uk/Software/BabelPad.html) Unicode-текстовим редактором (лише для Windows), який дає змогу вимкнути формоутворення, щоб побачити необроблені, окремі нез’єднані (без форми) символи, які фактично присутні у текстовому файлі — див. нижню половину цього комбінованого знімка екрана:

![Зображення, що показує здатність текстового редактора BabelPad вимикати формоутворення OpenType](/files/84a9c93521f1f2b8aebdbfdf29953d1ffe8aed54)

Використання Unicode-текстового редактора BabelPad для ввімкнення формоутворення OpenType (верхній рисунок) або його вимкнення (нижній рисунок). Вимкнення формоутворення OpenType значно полегшує редагування арабського тексту.

Поняття логічного порядку та порядку відображення, у поєднанні з процесами формоутворення, можуть бути досить заплутаними, коли ви вперше стикаєтеся з ними під час редагування або набору багатомовних текстових файлів, що містять складні письма, такі як арабське: сподіваємося, вищесказане допомогло уникнути певної початкової плутанини.


---

# 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/uk/dokladni-statti/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.
