> 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/it/articoli-approfonditi/51-unicode-utf-8-and-multilingual-text-an-introduction.md).

# Unicode, UTF-8 e testo multilingue: un'introduzione

## Unicode e OpenType: caratteri e glifi

I moderni motori TeX, cioè XeTeX e LuaTeX, si sono evoluti dal motore TeX originale di Knuth in gran parte a causa della necessità di tenere il passo con gli sviluppi nel panorama tecnologico, in particolare Unicode (per il testo) e OpenType (per i font). Oggi, mediante l'uso di pacchetti come [fontspec](https://ctan.org/pkg/fontspec?lang=en) e [unicode-math](https://ctan.org/pkg/unicode-math?lang=en), gli utenti LaTeX possono accedere a capacità di composizione tipografica estremamente sofisticate fornite dai font OpenType—inclusa la composizione tipografica multilingue avanzata e la composizione tipografica matematica basata su OpenType ([ideata da Microsoft](https://blogs.msdn.microsoft.com/murrays)).

Tuttavia, per ottenere il massimo dall'uso dei font OpenType con XeTeX/LuaTeX, può essere utile familiarizzare con una serie di argomenti/concetti di contesto—soprattutto per risolvere problemi o per spianare la strada a lavori più avanzati/complessi. Per esempio, potreste leggere che i motori XeTeX e LuaTeX usano un “input UTF-8” o che sono “Unicode aware”, e ulteriori letture sui font OpenType potrebbero discutere o menzionare argomenti come “codifica Unicode”, le “caratteristiche del font” OpenType, i “glifi”, gli “ID di glifo”, i “nomi dei glifi” e così via. Il nostro obiettivo è fornire un'introduzione a questi termini/argomenti e mettere insieme un quadro di base per mostrare come sono correlati e, si spera, fornire supporto per lavori successivi o per la risoluzione di problemi.

Gli argomenti che ci proponiamo di trattare rientrano piuttosto nettamente in due aree principali: *Unicode* che, in effetti, abita il mondo del testo/dei caratteri e della codifica del testo e *OpenType* il cui mondo è quello dei font e dei glifi; ma, naturalmente, quei due mondi sono interconnessi e c'è un certo grado di sovrapposizione, anche in questo primo articolo.

### Di quali argomenti parleremo?

Il focus principale di questo articolo riguarda alcuni temi legati a Unicode: si parte da una discussione su cosa si intende per “carattere” e si passa poi a introdurre scritture/lingue, la codifica Unicode e UTF-8—insieme a un esempio di lavoro con file di testo multilingue. Un articolo successivo partirà da questo per trattare argomenti di contesto relativi alla tecnologia dei font OpenType. Chiaramente, entro i limiti di un post di blog non è possibile tentare un “deep dive” in tutte le aree che speriamo di discutere: il nostro obiettivo dichiarato è fornire il quadro generale che mostri come alcuni concetti chiave siano collegati e funzionino insieme. Inizieremo con il concetto più basilare: quello del *carattere*.

## Il carattere: un mattone fondamentale

Un'idea/concezione fondamentale che è al centro delle nostre discussioni (e anche di Unicode) è il significato di “carattere”: è una di quelle parole il cui significato viene spesso “dato per scontato” nel suo uso nel lavoro quotidiano e nelle conversazioni. Tuttavia, dal punto di vista di Unicode, della composizione tipografica e delle tecnologie dei font, dobbiamo essere un po' più precisi e definire che cosa si intende per “un carattere”. Per esempio, potrebbe essere del tutto naturale per noi pensare a **un** e *un* come a caratteri diversi: ‘a in grassetto’ e ‘a in corsivo’. Ma non è così: sono semplicemente diverse rappresentazioni visive dello stesso carattere fondamentale, a cui Unicode assegna il nome ufficiale [LATIN SMALL LETTER A](http://unicode.org/charts/PDF/U0000.pdf).

Unicode [definisce un carattere](http://www.unicode.org/glossary/#character) come:

> “Il componente più piccolo del linguaggio scritto che abbia valore semantico; si riferisce al significato astratto e/o alla forma, piuttosto che a una forma specifica...”

che distingue chiaramente tra la *aspetto visivo* specifica *forma*.

e il suo *significato*Puoi pensare a un carattere come all'unità fondamentale, o mattone, di una lingua o, più correttamente, di una *forma* è davvero importante qui: il *ruolo e la funzione* di ciascun carattere come uno degli elementi di base da cui scritture/lingue sono infine costruite.

### Scrittura e lingua

Vale la pena menzionare brevemente due concetti importanti: *scritture* e *lingue*. Il sito web di Unicode fornisce una utile [definizione di una scrittura](https://www.unicode.org/standard/supported.html):

> “Lo Standard Unicode codifica scritture piuttosto che lingue. Quando sistemi di scrittura per più di una lingua condividono insiemi di simboli grafici che hanno derivazioni storicamente correlate, l'unione di tutti quei simboli grafici è trattata come una singola raccolta di caratteri per la codifica ed è identificata come una singola scrittura.”

Usando un [esempio da Wikipedia](https://en.wikipedia.org/wiki/Script_\(Unicode\)), la scrittura latina è composta da una particolare [collezione di caratteri](http://unicode.org/charts/) che sono utilizzati in più lingue: inglese, francese, tedesco, italiano e così via. Naturalmente, non tutti i caratteri definiti all'interno della scrittura latina sono utilizzati da tutte le lingue basate sulla scrittura latina—per esempio, l'alfabeto inglese non contiene i caratteri accentati presenti in altre lingue europee come il francese o il tedesco.

### Font OpenType: scritture e lingue

A questo punto passeremo da Unicode ai font OpenType perché i concetti di scrittura e lingua svolgono anch'essi un ruolo estremamente importante all'interno della tecnologia dei font OpenType.

Un insieme di lingue che usano la stessa [significato](http://www.unicode.org/glossary/#script) può avere ciascuna tradizioni tipografiche diverse quando si tratta di visualizzare (comporre tipograficamente) testo scritto in una determinata lingua. Un buon esempio si trova nella lingua turca e nel [comportamento della i senza punto](https://en.wikipedia.org/wiki/Dotted_and_dotless_I) (vedi le note di quella pagina sulle legature). Le “regole” tipografiche relative a scritture/lingue sono integrate nella funzionalità dei font OpenType tramite l'uso dei cosiddetti script e language *tag* che sono utilizzati per identificare le regole che dovrebbero applicarsi a particolari combinazioni scrittura/lingua. Naturalmente, l'insieme di scritture/lingue supportate da ciascun font OpenType varierà in base alle scelte fatte dai creatori del font e al motivo per cui è stato prodotto. Un software di composizione tipografica sofisticato, come XeTeX o LuaTeX, può sfruttare tali regole (incorporate nei font OpenType) consentendo agli utenti di applicarle selettivamente al testo di input quando compongono tipograficamente testo in una lingua particolare—per esempio, usando il pacchetto LaTeX [fontspec](https://ctan.org/pkg/fontspec?lang=en).

#### Guardando dentro un font OpenType: scritture/lingue

Solo per chiarire meglio, ecco una schermata che mostra il font gratuito [Scheherazade OpenType](http://software.sil.org/scheherazade/download/) aperto all'interno del (anch'esso gratuito) [Microsoft VOLT](https://www.microsoft.com/en-us/Typography/volt.aspx) software di editing dei font. In questa immagine puoi vedere le scritture, le lingue e le caratteristiche tipografiche integrate in Scheherazade—usando VOLT puoi aggiungere funzionalità e caratteristiche extra a Scheherazade, ma ciò è ben al di fuori dello scopo di questo articolo!

![Il font Scheherazade OpenType (in variante TrueType) aperto all'interno di Microsoft VOLT](/files/977620999264964397b6107d3fd4078c0335c3b1)

Da questa schermata si può vedere che Scheherazade supporta le scritture araba e latina e fornisce ulteriore supporto specialistico per diverse lingue che usano la scrittura araba—tramite i cosiddetti OpenType features, che sono elencati nella casella contornata in verde qui sopra. Non entreremo nello specifico di queste funzionalità ma il messaggio qui è che i font OpenType di alta qualità hanno molta intelligenza integrata al loro interno, pronta per essere usata da software di composizione tipografica in grado di sfruttare le regole tipografiche incorporate nei font.

Il lettore interessato può consultare il registro dei tag OpenType per vedere i [tag di script](https://www.microsoft.com/typography/otspec/scripttags.htm) e [tag di lingua](https://www.microsoft.com/typography/developers/opentype/languagetags.aspx) attualmente utilizzati all'interno della specifica OpenType.

### Torniamo ai caratteri: diversi ruoli dei caratteri

L'insieme dei caratteri che costituiscono gli elementi fondamentali di una scrittura (o lingua) non svolge tutti lo stesso ruolo. Per esempio, nella maggior parte delle lingue ci sono caratteri per *punteggiatura*, caratteri per le *cifre* così come i caratteri che consideriamo *lettere* dell'alfabeto che, per alcune scritture, esistono anche in forma maiuscola e minuscola. Il concetto di carattere è piuttosto ampio e lo Standard Unicode include caratteri speciali che non sono *progettati per essere visualizzati* ma il cui compito è “controllare l'interpretazione o la visualizzazione del testo”. Per esempio, componendo tipograficamente del testo arabo si può voler forzare, o impedire, il comportamento di collegamento di certi caratteri; lo standard Unicode fornisce speciali caratteri di controllo per farlo: i cosiddetti [ZERO WIDTH JOINER](https://en.wikipedia.org/wiki/Zero-width_joiner) e il [ZERO WIDTH NON-JOINER](https://en.wikipedia.org/wiki/Zero-width_non-joiner). Quei caratteri non sono destinati alla visualizzazione e vengono “assorbiti” dal software durante l'elaborazione del testo per produrre i loro effetti visivi previsti.

Tutti i caratteri specificati all'interno dello standard Unicode sono assegnati a un insieme di proprietà che, in effetti, descrive il ruolo e la funzione di ciascun carattere nella codifica Unicode—i nomi dei caratteri, come LATIN SMALL LETTER A, sono solo un elemento dell'elenco delle proprietà di un carattere. Queste proprietà sono descritte in modo completo nel [Unicode Character Database (UCD)](http://www.unicode.org/reports/tr44/) e sono ampiamente utilizzate in operazioni computerizzate di elaborazione del testo come ricerca, ordinamento, controllo ortografico e così via. Anche i file di dati che elencano le proprietà dei caratteri Unicode sono [disponibili per il download](http://www.unicode.org/Public/UCD/latest/).

Tra le proprietà assegnate a ciascun carattere, la più importante per la nostra discussione è un *identificatore numerico* assegnato dalla sua codifica Unicode, argomento a cui passiamo ora.

### Caratteri: numeri e codifiche

È banale dirlo, ma computer e altri dispositivi digitali si occupano di memorizzare ed elaborare dati numerici: quindi come si collega questo al testo? Quando scrivi del testo usando la tastiera di un computer, o toccando lo schermo di un dispositivo mobile, i tuoi tasti vengono trasformati in numeri che rappresentano la stringa di caratteri che stai digitando.

A un certo punto potresti voler trasferire quel testo (una sequenza di numeri) tramite un'e-mail, un messaggio di testo o tramite comunicazione online come un Tweet o un post su qualche forma di social media. Chiaramente, il dispositivo su cui hai composto il testo e il dispositivo o i dispositivi usati dai suoi destinatari devono, in qualche modo, concordare su quali numeri rappresentano quali caratteri. In caso contrario, il tuo testo potrebbe non essere visualizzato correttamente sul dispositivo del destinatario.

Perché le comunicazioni globali di oggi funzionino, i dispositivi di invio e ricezione hanno bisogno di qualche “convenzione mutuamente concordata” attraverso la quale un particolare insieme di numeri rappresenti un insieme specifico di caratteri. Questa convenzione si chiama una *codifica*: un insieme di numeri usato per rappresentare un particolare insieme di caratteri e la codifica Unicode è ormai lo standard *de facto* globale.

## Unicode: bit e byte per memorizzare il testo

Unicode è uno standard enorme che copre molto, molto più della sola codifica del testo, ma qui ci concentriamo solo sulla codifica che fornisce.

#### Bit, byte e quanti caratteri?

Abbiamo detto che i dispositivi memorizzano e rappresentano il testo come numeri—in particolare, i caratteri saranno memorizzati come interi: numeri interi. Per comprendere le implicazioni di ciò per la codifica Unicode, dobbiamo fare una *molto* breve, *molto* di base rassegna di come i computer memorizzano gli interi (non intendiamo addentrarci nell'informatica).

Per farla breve, gli odierni dispositivi desktop o portatili memorizzano gli interi in “blocchi” discreti che possono essere lunghi 1, 2, 4 o 8 byte. Ciascuna di queste unità di memorizzazione può contenere interi fino a un valore positivo massimo basato sul numero totale di bit contenuti in ciascuna unità di memorizzazione:

* 1 byte (8 bit): l'intero positivo massimo è 255;
* 2 byte (16 bit): l'intero positivo massimo è 65535;
* 4 byte (32 bit): l'intero positivo massimo è 4,294,967,295;
* 8 byte (64 bit): l'intero positivo massimo è 18,446,744,073,709,551,615.

In pratica, lo standard Unicode usa numeri nell'intervallo da 0 a 1,114,111 per codificare tutti i caratteri del mondo, con il risultato che bastano 21 bit per codificare l'intero intervallo. Possiamo vederlo notando che le unità di memorizzazione contenenti n bit possono rappresentare qualsiasi intero positivo da 0 fino a un valore massimo di $$2^n -1$$; di conseguenza:

* il valore massimo memorizzabile in 20 bit è $$2^{20} -1 = 1,048,575$$ (troppo piccolo);
* il valore massimo memorizzabile in 21 bit è $$2^{21} -1 = 2,097,151$$ (abbastanza grande).

Abbiamo notato che i computer memorizzano i dati (numeri) in unità da 1, 2, 4 (o 8) byte, quindi quanto deve essere grande l'unità di memorizzazione se dobbiamo conservare valori fino al valore Unicode massimo di 1,114,111? Chiaramente, un'unità di memorizzazione grande un byte può contenere un valore massimo di 255 e 2 byte possono memorizzare 65535: nessuno di questi due è sufficiente per memorizzare l'intero intervallo di caratteri codificati da Unicode. L'opzione successiva disponibile è costituita da unità di memorizzazione di dimensione 4 byte, che possono conservare interi fino a un massimo di 4,294,967,295, cioè molto più di quanto ci servirebbe davvero. Quindi, se scegliessimo 4 byte come unità di memorizzazione avremmo certamente spazio più che sufficiente per conservare tutti i valori Unicode, con ciascun carattere memorizzato come un intero che richiede 4 byte (32 bit). Tuttavia, usare 4 byte per memorizzare tutto è molto dispendioso in termini di spazio perché persino i valori Unicode più grandi richiedono al massimo 21 bit—che, se memorizzati usando 32 bit, significherebbe che 11 di quei 32 bit non verrebbero mai usati.

**Nota**: Benché l'intervallo Unicode vada da 0 a 1,114,111, non ogni valore di quell'intervallo è effettivamente usato: per ragioni tecniche, alcuni valori sono considerati non validi per l'uso effettivo come caratteri Unicode.

### Allora, che cos'è UTF-8?

Se leggi di XeTeX o LuaTeX, è quasi certo che incontrerai spiegazioni che affermano che quei motori TeX leggono i file di testo e di input LaTeX in “formato UTF-8”. Allora, che cos'è il “formato UTF-8” e come si collega a Unicode? Nel gergo Unicode, ciascuno dei suoi 1,114,112 valori (da 0 a 1,114,111) usati per codificare i caratteri del mondo è chiamato un [punto di codice](http://www.unicode.org/glossary/#code_point).

Abbiamo visto che, *in teoria*, dovremmo memorizzare tutto il nostro testo codificato in Unicode usando 4 byte per carattere per rappresentare l'intero intervallo dei punti di codice Unicode. Tuttavia, in pratica, alcune persone piuttosto brillanti inventarono un modo semplice per rappresentare un singolo numero Unicode (punto di codice) come un *sequenza* insieme di numeri più piccoli, e ciascuno di questi numeri più piccoli viene memorizzato in un singolo byte: un processo che *trasforma* un singolo intero (più grande) in una sequenza di elementi più piccoli (della dimensione di un byte). A causa di questa trasformazione, i caratteri del nostro file di testo non sono più rappresentati ciascuno da un singolo valore numerico: ogni carattere diventa una *sequenza multibyte*—qualsiasi cosa, da 1 a 4 byte (consecutivi) nel file di testo può rappresentare un singolo carattere Unicode individuale (cioè il suo valore di punto di codice).

UTF sta per *Unicode Transformation Format* e la parola chiave qui è *Transformation*. In sostanza, puoi pensare a UTF-8 come a una “ricetta” o a un algoritmo per convertire (trasformare) un singolo valore di punto di codice Unicode in una sequenza di 1 a 4 pezzi della dimensione di un byte. All'aumentare del valore del punto di codice Unicode aumenta anche il numero di singoli byte necessari per rappresentarlo in formato UTF-8.

Ci sono ragioni tecniche e storiche per la creazione di UTF-8 e la storia dietro l'invenzione di UTF-8 è [raccontata in una affascinante e-mail del 2003](https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt), che, verso l'inizio dell'e-mail, contiene la frase:

> “Non è vero. UTF-8 è stato progettato, davanti ai miei occhi, su una tovaglietta in un diner del New Jersey una notte di settembre circa nel 1992.”

#### Un esempio: la lettera araba ل

Prendiamo come esempio la lettera araba ل (nome Unicode ARABIC LETTER LAM), a cui è assegnato il valore di punto di codice Unicode 1604 (decimale) o 0644 (esadecimale): la sua rappresentazione in UTF-8 è la *a due byte* sequenza D9 84 (hex) o, in decimale, 217 132. Quando si usa UTF-8 come formato per memorizzare il testo, invece di un file di testo contenente il singolo numero 1604 per rappresentare ل, questo viene convertito in due valori di dimensione byte: 217 e 132—il carattere ل è memorizzato come una *sequenza a due byte*. I lettori che vogliono esplorare l'algoritmo UTF-8 in modo più dettagliato possono trovare una spiegazione approfondita, e codice C, sul mio [sito del mio blog personale](http://www.readytext.co.uk/?p=1284).

Quando un software (ad esempio XeTeX o LuaTeX) legge testo in formato UTF-8, quel software deve determinare il valore Unicode di ogni carattere presente in quel file, quindi usa un algoritmo per *invertire* il processo di trasformazione UTF-8. Attraverso quell'“algoritmo di inversione” i due byte (217 e 132) vengono ricombinati per generare l'intero 1604, che può quindi essere riconosciuto come il valore del punto di codice Unicode della lettera araba ل.

Quindi, in conclusione, UTF-8 è davvero soltanto un formato dati intermedio usato per la memorizzazione e la trasmissione di testo codificato in Unicode.

**Nota**: Alcuni sistemi scelgono di usare/memorizzare il testo utilizzando 32 bit per carattere, questo si chiama [UTF-32](https://en.wikipedia.org/wiki/UTF-32)—esiste anche [UTF-16](https://en.wikipedia.org/wiki/UTF-16) ma UTF-8 è il modo più comune per memorizzare testo codificato in Unicode.

## File TeX multilingue: XeTeX e LuaTeX

Sia XeTeX sia LuaTeX sono in grado di una composizione tipografica multilingue molto sofisticata, anche se i loro meccanismi per ottenerla sono piuttosto diversi e riflettono la filosofia di progettazione/sviluppo di ciascun motore. Non approfondiremo questo aspetto ma ci limitiamo a notare che il motore XeTeX contiene componenti software (integrate nel suo eseguibile) che non sono presenti in LuaTeX—soprattutto software per un processo chiamato *shaping OpenType* (ad esempio, tramite una libreria chiamata [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)).

LuaTeX, al contrario, adotta un approccio diverso: invece di incorporare funzionalità direttamente nel vero motore TeX, LuaTeX fornisce una collezione estremamente ricca di comandi (primitive TeX) e una API basata su Lua molto potente [API basata su Lua](/latex/it/articoli-approfonditi/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md) attraverso la quale gli sviluppatori possono costruire soluzioni altrettanto avanzate per la composizione tipografica multilingue. Sebbene la filosofia di LuaTeX possa comportare lavoro extra per gli sviluppatori di pacchetti LaTeX, offre una grande quantità di flessibilità aggiuntiva perché le soluzioni non sono “hard coded” nel motore LuaTeX stesso, ma sono costruite a partire da codice TeX e Lua—oppure da plugin scritti in C/C++.

**Inciso**: I lettori che desiderano esplorare ulteriormente l'affascinante, ma complesso, mondo dello shaping OpenType potrebbero essere interessati a leggere della superba libreria open-source chiamata [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)—utilizzata da molte applicazioni tra cui Firefox, Chrome e LibreOffice e, naturalmente, da XeTeX. L'autore di questo articolo ha usato HarfBuzz per creare [plugin LuaTeX per la composizione tipografica dell'arabo](http://www.readytext.co.uk/?p=3186).

Ormai è normale (per esempio, sui social media) trasmettere testo che contiene caratteri di più lingue e un file di testo UTF-8 che memorizza testo multilingue può facilmente contenere caratteri la cui rappresentazione in UTF-8 è lunga 1, 2, 3 o 4 byte. Quindi, in effetti, un file di testo UTF-8 è solo un flusso di singoli byte ma ogni carattere effettivo in quel file potrebbe essere lungo da 1 a 4 byte: i singoli caratteri sono diventati *sequenze multibyte*.

Per esplorare ulteriormente alcuni aspetti chiave del lavoro con testo multilingue (tipografico) useremo un esempio contenente la scrittura araba perché l'arabo ci offre spazio per affrontare più concetti.

#### Inciso: la scrittura araba

Il [La scrittura araba](https://en.wikipedia.org/wiki/Arabic_script) è scritta in uno stile corsivo che si legge e si scrive da destra a sinistra. Ogni lettera araba può, potenzialmente, assumere una delle 4 forme diverse a seconda di:

* se è visualizzata come un carattere singolo, autonomo (isolato), non collegato a nient'altro;
* se si trova all'interno di una parola—all'inizio, nel mezzo o alla fine di una parola: indicate rispettivamente come *iniziale*, *mediale* e *finale* forme, rispettivamente.

Ogni carattere della scrittura araba ha il proprio insieme di regole di collegamento e può, oppure no, cambiare forma/aspetto quando ha un altro carattere alla sua sinistra, alla sua destra o sia a sinistra sia a destra. I lettori interessati ad approfondire possono trovare un [elenco completo su Wikipedia](https://en.wikipedia.org/wiki/Template:Arabic_alphabet_shapes/joining).

#### Esempio: testo arabo e inglese in UTF-8

Supponiamo di creare un file di testo UTF-8 contenente una singola riga di testo inglese e arabo: This is العَرَبِيَّة text!

Questa riga di testo contiene 3 caratteri spazio, 11 caratteri inglesi (scrittura latina) e 12 caratteri arabi (anche se ciò potrebbe non essere immediatamente ovvio/apparente). Quando viene salvata come file di testo UTF-8 occupa 38 byte di spazio di memorizzazione, risultanti da quanto segue:

* **Scrittura latina**: spazi più testo inglese: 14 ✕ caratteri da 1 byte = 14 byte;
* **La scrittura araba**: 12 caratteri arabi ✕ 2 byte per carattere = 24 byte.

Un totale di 14 + 24 = 38 byte.

#### Approfondendo

Se salviamo il nostro testo di esempio in un file UTF-8 chiamato `arabic.txt` e lo apriamo in un editor esadecimale possiamo esaminarlo per vedere i byte effettivi che contiene. Dallo studio della seguente schermata annotata puoi vedere che il testo arabo è memorizzato come 2 byte per carattere:

![Un file di testo UTF-8 contenente testo inglese e arabo aperto in un editor esadecimale.](/files/ccf3cd35270497673cde5076f34c288a1cd0def2)

Un file di testo UTF-8 contenente testo inglese e arabo aperto in un editor esadecimale. Puoi vedere chiaramente che i caratteri della scrittura latina richiedono un singolo byte, mentre i caratteri della scrittura araba sono memorizzati usando due byte per carattere.

Da questa schermata si possono fare un paio di osservazioni:

* il testo arabo è memorizzato in una sequenza da sinistra a destra e i caratteri sono le versioni grezze e non modellate (isolate) delle lettere e delle vocali arabe;
* non c'è alcuna informazione aggiuntiva dopo la scrittura latina “This is ” per informare qualsiasi software che legge questo file che il carattere successivo è nella scrittura araba.

Se stai componendo tipograficamente un documento multilingue (per esempio, contenente inglese e arabo), allora durante la lettura/elaborazione del file di testo di input (come flusso di byte) XeTeX o LuaTeX devono essere in grado di rilevare l'inizio e la fine di ogni carattere e leggere il numero corretto di byte necessario per invertire la trasformazione UTF-8 e generare il corrispondente punto di codice Unicode. È proprio l'algoritmo UTF-8 che consente al software di farlo: permette di rilevare il primo byte di ciascun carattere individuale e quanti byte debbano essere letti per calcolare il corrispondente punto di codice Unicode. UTF-8 è semplice da usare, ma davvero molto ingegnoso.

#### Ordine logico, ordine di visualizzazione e shaping OpenType

Se guardi attentamente l'arabo sopra (العَرَبِيَّة) può essere difficile vedere che il nostro file di testo contiene effettivamente 12 singoli caratteri arabi—soprattutto se non hai familiarità con la scrittura araba! Tuttavia, se conti con attenzione i caratteri arabi visualizzati sul lato destro della schermata sopra puoi vedere che sono 12 in totale.

Per le lingue con scritture complesse, come l'arabo, ciò che il nostro file di testo *memorizza* e ciò che tu *vedi sullo schermo* sono visibilmente *molto* davvero diversi! Ciò che vedi quando visualizzi quel testo in, ad esempio, un browser, è (a seconda del font usato):

![Immagine di testo arabo composto tipograficamente](/files/b980c98b0798cec31c2a0ccf726a8d15d1d025c7)

Ma, come mostra la schermata sopra, ciò che il file di testo UTF-8 contiene davvero è questo:

![Immagine di testo arabo non impaginato (caratteri isolati)](/files/e5ac6d0a32dc9aa5eb68789d281bd9c929a53609)

Anche se non hai familiarità con la natura corsiva della scrittura araba, puoi vedere chiaramente che è “successo qualcosa” nel corso del trasferimento dei caratteri arabi contenuti in un file di testo fino all’impaginazione e/o alla visualizzazione sullo schermo (come glifi). Se sei abituato a usare TeX/LaTeX con lingue a scrittura semplice, ad esempio le lingue basate sul latino, questo può davvero essere molto confuso!

Qui sono in gioco alcuni concetti importanti perché i file di testo Unicode servono a memorizzare… beh, testo (Unicode), mentre i sistemi di impaginazione e visualizzazione servono a usare font e glifi (OpenType):

* il file di testo ha salvato i caratteri arabi in ordine da sinistra a destra, ma l'arabo si legge/visualizza da destra a sinistra: i file di testo memorizzano il testo nel cosiddetto *ordine logico*;
* il file di testo contiene caratteri individuali che appaiono molto diversi dalla visualizzazione effettiva presentata sullo schermo: il file di testo contiene i caratteri arabi nella loro forma isolata, non unita.

#### Che cosa sta succedendo?

All'interno di un file di testo l'arabo è memorizzato come una sequenza da sinistra a destra di caratteri in forma isolata: se ci pensi, il file di testo memorizza il testo arabo nell'ordine/sequenza *in cui è stato digitato* (il *ordine logico*). È solo quando quel testo viene elaborato per la visualizzazione, o impaginato, che viene visualizzato nel suo corretto ordine di lettura, spesso indicato come *ordine visivo* o *ordine di visualizzazione*; inoltre, le forme isolate dei caratteri arabi vengono *modellate* nelle loro versioni di visualizzazione tipograficamente corrette. Un modo di pensarci è che un semplice file di testo deve memorizzare il testo (caratteri Unicode) nella forma più basilare possibile: caratteri testuali grezzi, non modellati, individuali: spetta al software di sistema renderizzare tali caratteri per la visualizzazione in base al sistema operativo, ai font e al software di impaginazione/rendering disponibili sul dispositivo di visualizzazione.

Quando il testo arabo in quel file viene impaginato/visualizzato, subisce un processo chiamato *modellazione*. I singoli caratteri arabi vengono convertiti in glifi modellati che rappresentano correttamente la variante di ciascun carattere richiesta in base alle regole di collegamento della scrittura e del sistema di scrittura arabi. Inoltre, un software di impaginazione di alta qualità (che utilizza buoni font OpenType) aggiungerà un'ulteriore elaborazione applicando un'ulteriore sofisticazione tipografica attraverso un processo chiamato *shaping OpenType*—un processo che comprende un'ampia gamma di operazioni tipografiche che possono includere:

* la sostituzione di più glifi individuali con un singolo glifo di legatura complessa (molto comune in arabo), oppure
* operazioni di posizionamento che, ad esempio, regolano le posizioni delle vocali arabe in base al glifo sopra o sotto il quale si trovano.

![Immagine che mostra la trasformazione subita dal testo arabo quando viene impaginato](/files/4e183725134df779dd79654e18d8c584ee0a3c40)

La differenza tra ordine logico e ordine visivo (di visualizzazione). In questa grafica puoi vedere che i caratteri arabi memorizzati in un file di testo subiscono riordino e modellazione quando vengono visualizzati o impaginati.

I progettisti e i creatori di font OpenType avanzati investono molto tempo e grande competenza per offrire le sofisticate capacità tipografiche integrate nei loro font.

Per disattivare la modellazione applicata al testo arabo possiamo usare l'eccellente, gratuito, [BabelPad](http://www.babelstone.co.uk/Software/BabelPad.html) editor di testo Unicode (solo Windows) che consente di disattivare la modellazione per vedere i caratteri grezzi, individuali e non uniti (non modellati) effettivamente presenti nel file di testo—vedi la metà inferiore di questa schermata combinata:

![Immagine che mostra la capacità dell'editor di testo BabelPad di disattivare la modellazione OpenType](/files/c694f5f1b8ad5de4ad2702a05507e0c1a417fa57)

Utilizzo dell'editor di testo Unicode BabelPad per attivare la modellazione OpenType (figura superiore) o disattivarla (figura inferiore). Disattivare la modellazione OpenType rende molto più facile modificare il testo arabo.

I concetti di ordine logico e ordine di visualizzazione, uniti ai processi di modellazione, possono essere piuttosto confusi quando li incontri per la prima volta durante la modifica o l'impaginazione di file di testo multilingue contenenti scritture complesse come l'arabo: si spera che quanto sopra abbia aiutato a evitare un po' di confusione iniziale.


---

# 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/it/articoli-approfonditi/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.
