> 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/overleaf-learn-latex-pt/artigos-aprofundados/51-unicode-utf-8-and-multilingual-text-an-introduction.md).

# Unicode, UTF-8 e texto multilingue: Uma introdução

## Unicode e OpenType: Caracteres e glifos

Motores TeX modernos, ou seja, XeTeX e LuaTeX, evoluíram a partir do motor TeX original de Knuth em grande parte devido à necessidade de acompanhar os desenvolvimentos no panorama tecnológico, em particular Unicode (para texto) e OpenType (para fontes). Hoje, através do uso de pacotes como [fontspec](https://ctan.org/pkg/fontspec?lang=en) e [unicode-math](https://ctan.org/pkg/unicode-math?lang=en), os utilizadores de LaTeX podem aceder a capacidades de composição tipográfica extremamente sofisticadas fornecidas por fontes OpenType — incluindo composição tipográfica multilingue avançada e composição tipográfica matemática baseada em OpenType ([introduzida pela Microsoft](https://blogs.msdn.microsoft.com/murrays)).

No entanto, para tirar o máximo partido do uso de fontes OpenType com XeTeX/LuaTeX, pode ser útil familiarizar-se com vários tópicos/conceitos de base — especialmente para diagnosticar problemas ou para preparar o caminho para trabalhos mais avançados/complexos. Por exemplo, pode ler que os motores XeTeX e LuaTeX usam “entrada UTF-8” ou que são “conscientes de Unicode”, e leituras adicionais sobre fontes OpenType podem discutir ou mencionar tópicos como “codificação Unicode”, “etiquetas” OpenType, “glifos”, “IDs de glifos”, “nomes de glifos” e assim por diante. O nosso objetivo é apresentar uma introdução a estes termos/tópicos e montar uma estrutura básica para mostrar como estão relacionados e, esperamos, fornecer apoio para trabalho posterior ou resolução de problemas.

Os tópicos que pretendemos cobrir enquadram-se de forma bastante clara em duas áreas principais: *Unicode* que, na prática, habita o mundo do texto/caracteres e da codificação de texto e *OpenType* cujo mundo é o das fontes e dos glifos; mas, claro, esses dois mundos estão interligados e existe alguma sobreposição, mesmo neste primeiro artigo.

### Que tópicos vamos discutir?

O foco principal deste artigo é alguns tópicos relacionados com Unicode: começando com uma discussão sobre o que se entende por um “caractere” e passando depois à introdução de escritas/línguas, codificação Unicode e UTF-8 — juntamente com um exemplo de trabalho com ficheiros de texto multilingues. Um artigo seguinte dará continuidade a esta peça para cobrir tópicos de base relacionados com a tecnologia de fontes OpenType. Claramente, dentro dos limites de uma publicação de blog não é possível tentar um “mergulho profundo” em todas as áreas que esperamos discutir: o nosso objetivo declarado é fornecer a estrutura geral que mostra como alguns conceitos-chave estão relacionados e funcionam em conjunto. Começaremos com o conceito mais básico: o de *carácter*.

## O caractere: um bloco básico de construção

Uma ideia/conceito fundamental que está no centro das nossas discussões (e das do Unicode) é o significado de um “caractere”: é uma daquelas palavras cujo significado é frequentemente “assumido” pelo seu uso no trabalho e nas conversas do dia a dia. No entanto, da perspetiva do Unicode, da composição tipográfica e das tecnologias de fontes, precisamos de ser um pouco mais precisos e definir o que se entende por “um caractere”. Por exemplo, pode ser bastante natural para nós pensar em **a** e *a* como caracteres diferentes: ‘a em negrito’ e ‘a itálico’. Mas não é assim: são apenas representações visuais diferentes do mesmo caractere fundamental, ao qual o Unicode dá o nome oficial [LETRA LATINA MINÚSCULA A](http://unicode.org/charts/PDF/U0000.pdf).

Unicode [define um caractere](http://www.unicode.org/glossary/#character) como:

> “O menor componente da linguagem escrita que tem valor semântico; refere-se ao significado e/ou à forma abstratos, e não a uma forma específica...”

que distingue claramente entre a forma específica de um caractere *aparência visual* e o seu *significado*.

Pode pensar num caractere como a unidade fundamental, ou bloco de construção, de uma língua ou, mais corretamente, de uma *escrita*—um tópico que discutimos abaixo. A aparência real de um caractere quando apresentado com uma fonte particular não é relevante para a definição de caractere do Unicode: apenas a *significado* tem verdadeiro interesse aqui: a *função e propósito* de cada caractere como um dos vários blocos de construção a partir dos quais as escritas/línguas são, em última análise, construídas.

### Escrita e língua

Vale a pena mencionar brevemente dois conceitos importantes: *escritas* e *idiomas*. O sítio Web do Unicode fornece uma [definição útil de uma escrita](https://www.unicode.org/standard/supported.html):

> “A Norma Unicode codifica escritas e não línguas. Quando sistemas de escrita para mais do que uma língua partilham conjuntos de símbolos gráficos que historicamente têm derivação relacionada, a união de todos esses símbolos gráficos é tratada como uma única coleção de caracteres para codificação e é identificada como uma única escrita.”

Usando um [exemplo da Wikipédia](https://en.wikipedia.org/wiki/Script_\(Unicode\)), a escrita latina é composta por uma particular [coleção de caracteres](http://unicode.org/charts/) que são usados em múltiplas línguas: inglês, francês, alemão, italiano e assim por diante. Naturalmente, nem todos os caracteres definidos na escrita latina são usados por todas as línguas baseadas na escrita latina — por exemplo, o alfabeto inglês não contém os caracteres acentuados presentes noutras línguas europeias, como o francês ou o alemão.

### Fontes OpenType: escritas e línguas

Nesta altura passaremos do Unicode para as fontes OpenType porque os conceitos de escrita e língua também desempenham um papel extremamente importante na tecnologia de fontes OpenType.

Um conjunto de línguas que usa a mesma [escrita](http://www.unicode.org/glossary/#script) pode ter diferentes tradições tipográficas quando se trata de apresentar (compor tipograficamente) texto escrito numa língua particular. Um bom exemplo encontra-se na língua turca e no [comportamento do i sem ponto](https://en.wikipedia.org/wiki/Dotted_and_dotless_I) (ver as notas dessa página sobre ligaduras). As “regras” tipográficas relacionadas com escritas/línguas estão incorporadas na funcionalidade das fontes OpenType através do uso das chamadas etiquetas de escrita e de língua *etiquetas* que são usadas para identificar regras que devem aplicar-se a combinações específicas de escrita/língua. Naturalmente, o conjunto de escritas/línguas suportadas por cada fonte OpenType varia de acordo com as escolhas feitas pelos criadores da fonte e com o motivo da sua produção. Software de composição tipográfica sofisticado, como XeTeX ou LuaTeX, pode tirar partido dessas regras (incorporadas nas fontes OpenType) permitindo aos utilizadores aplicá-las seletivamente ao texto de entrada quando compõem texto numa língua particular — por exemplo, usando o pacote LaTeX [pacote fontspec](https://ctan.org/pkg/fontspec?lang=en).

#### A olhar dentro de uma fonte OpenType: escritas/línguas

Só para tornar isto mais claro, aqui está uma captura de ecrã a mostrar a fonte OpenType gratuita [Scheherazade OpenType](http://software.sil.org/scheherazade/download/) aberta dentro do software gratuito (também) [Microsoft VOLT](https://www.microsoft.com/en-us/Typography/volt.aspx) de edição de fontes. Nesta imagem pode ver as escritas, línguas e funcionalidades tipográficas que estão incorporadas no Scheherazade — usando o VOLT pode adicionar funcionalidades e capacidades extra ao Scheherazade, mas isso está muito fora do âmbito deste artigo!

![A fonte Scheherazade OpenType (em formato TrueType) aberta no Microsoft VOLT](/files/c275561a1bf992e0f53943ce304a1910c3080249)

A partir desta captura de ecrã pode ver que o Scheherazade suporta as escritas árabe e latina e fornece apoio especializado adicional para várias línguas que usam a escrita árabe — utilizando as chamadas funcionalidades OpenType, que estão listadas na caixa com borda verde acima. Não entraremos nos pormenores destas funcionalidades, mas a mensagem aqui é que as fontes OpenType de alta qualidade têm muita inteligência incorporada, pronta a ser usada por software de composição tipográfica capaz de tirar partido das regras tipográficas integradas nas fontes.

O leitor interessado pode consultar o registo de etiquetas OpenType para ver as [etiquetas de escrita](https://www.microsoft.com/typography/otspec/scripttags.htm) e [etiquetas de língua](https://www.microsoft.com/typography/developers/opentype/languagetags.aspx) atualmente usadas na especificação OpenType.

### De volta aos caracteres: diferentes funções dos caracteres

O conjunto de caracteres que compõe os elementos fundamentais de uma escrita (ou língua) não desempenha todos o mesmo papel. Por exemplo, na maioria das línguas existem caracteres para *pontuação*, caracteres para *algarismos* bem como os caracteres que pensamos como *letras* do alfabeto que, para algumas escritas, também existem em formas maiúsculas e minúsculas. O conceito de caractere é bastante amplo e a Norma Unicode inclui caracteres especializados que *não foram concebidos para serem exibidos* mas cuja função é “controlar a interpretação ou a apresentação do texto”. Por exemplo, ao compor algum texto árabe pode querer forçar, ou impedir, o comportamento de ligação de certos caracteres; a norma Unicode fornece caracteres de controlo especiais para fazer isso: os chamados [LIGADOR DE LARGURA ZERO](https://en.wikipedia.org/wiki/Zero-width_joiner) e [NÃO-LIGADOR DE LARGURA ZERO](https://en.wikipedia.org/wiki/Zero-width_non-joiner). Esses caracteres não se destinam a ser exibidos e são “absorvidos” pelo software durante o processamento do texto para produzir os efeitos visuais pretendidos.

A todos os caracteres especificados na norma Unicode é atribuído um conjunto de propriedades que, na prática, descreve a função e o propósito de cada caractere na codificação Unicode — nomes de caracteres, como LETRA LATINA MINÚSCULA A, são apenas um elemento da lista de propriedades de um caractere. Estas propriedades são descritas em detalhe na [Base de Dados de Caracteres Unicode (UCD)](http://www.unicode.org/reports/tr44/) e são amplamente utilizadas em operações de processamento de texto informatizado, como pesquisa, ordenação, verificação ortográfica e assim por diante. Ficheiros de dados que listam as propriedades dos caracteres Unicode também estão [disponíveis para descarregamento](http://www.unicode.org/Public/UCD/latest/).

Entre as propriedades atribuídas a cada caractere, a mais importante para a nossa discussão é um *identificador numérico* atribuído pela sua codificação Unicode, um tópico para o qual passamos agora.

### Caracteres: números e codificações

É uma afirmação óbvia, mas os computadores e outros dispositivos digitais dedicam-se a armazenar e processar dados numéricos: então como é que isso se relaciona com texto? À medida que escreve algum texto usando um teclado de computador, ou tocando no ecrã de um dispositivo móvel, as suas teclas premidas são transformadas em números que representam a sequência de caracteres que está a digitar.

Em algum momento pode querer transferir esse texto (uma sequência de números) através de um e-mail, de uma mensagem de texto ou via comunicação online, como um Tweet ou uma publicação numa qualquer forma de rede social. Claramente, o dispositivo no qual compôs o texto e o(s) dispositivo(s) usado(s) pelo(s) destinatário(s) devem, de alguma forma, concordar sobre quais números representam quais caracteres. Se não, o seu texto pode não ser apresentado corretamente no dispositivo do destinatário.

Para que as comunicações globais de hoje funcionem, os dispositivos de envio e de receção precisam de alguma “convenção mutuamente acordada” através da qual um conjunto particular de números representa um conjunto específico de caracteres. Esta convenção chama-se uma *codificação*: um conjunto de números usado para representar um conjunto particular de caracteres e a codificação Unicode é agora a *de facto* norma global.

## Unicode: bits e bytes para armazenar texto

Unicode é uma norma enorme que cobre muito, muito mais do que apenas a codificação de texto, mas aqui estamos a concentrar-nos apenas na codificação que ela fornece.

#### Bits, bytes e quantos caracteres?

Mencionámos que os dispositivos armazenam e representam texto como números — especificamente, os caracteres serão armazenados como inteiros: números inteiros. Para compreender as implicações disto para a codificação Unicode, precisamos de ter uma *muito* breve, *muito* revisão básica de como os computadores armazenam inteiros (não pretendemos aventurar-nos na ciência da computação).

Para abreviar uma história muito longa, os dispositivos de secretária ou portáteis de hoje armazenam inteiros em “blocos” discretos que podem ter 1, 2, 4 ou 8 bytes. Cada uma destas unidades de armazenamento pode armazenar inteiros até um valor positivo máximo com base no número total de bits contidos em cada unidade de armazenamento:

* 1 byte (8 bits): o inteiro positivo máximo é 255;
* 2 bytes (16 bits): o inteiro positivo máximo é 65535;
* 4 bytes (32 bits): o inteiro positivo máximo é 4,294,967,295;
* 8 bytes (64 bits): o inteiro positivo máximo é 18,446,744,073,709,551,615.

Na prática, a norma Unicode usa números na faixa de 0 a 1,114,111 para codificar todos os caracteres do mundo, com o resultado de que precisa apenas de 21 bits para codificar a faixa completa. Podemos ver isso ao notar que unidades de armazenamento que contenham n bits podem representar qualquer inteiro positivo de 0 até um valor máximo de $$2^n -1$$; consequentemente:

* o valor máximo que pode ser armazenado em 20 bits é $$2^{20} -1 = 1,048,575$$ (demasiado pequeno);
* o valor máximo que pode ser armazenado em 21 bits é $$2^{21} -1 = 2,097,151$$ (suficientemente grande).

Observámos que os computadores armazenam dados (números) em unidades de 1, 2, 4 (ou 8) bytes, então quão grande precisa de ser a unidade de armazenamento se tivermos de armazenar valores até ao valor Unicode máximo de 1,114,111? Claramente, uma unidade de armazenamento do tamanho de um byte pode conter um valor máximo de 255 e 2 bytes podem armazenar 65535: nenhum destes é suficiente para armazenar a gama completa de caracteres codificados por Unicode. A próxima opção disponível são unidades de armazenamento com tamanho de 4 bytes, que podem armazenar inteiros até um máximo de 4,294,967,295, muito mais do que realmente precisaríamos. Portanto, se escolhêssemos 4 bytes como unidade de armazenamento, teríamos certamente espaço mais do que suficiente para armazenar todos os valores Unicode, com cada caractere a ser armazenado como um inteiro que requer 4 bytes (32 bits). No entanto, usar 4 bytes para armazenar tudo é um grande desperdício de espaço porque até os maiores valores Unicode precisam de um máximo de 21 bits — o que, se armazenado em 32 bits, significaria que 11 desses 32 bits nunca seriam usados.

**Nota**: Embora a faixa Unicode vá de 0 a 1,114,111, nem todos os valores nessa faixa são realmente usados: por razões técnicas, alguns valores são considerados inválidos para uso real como caracteres Unicode.

### Então, o que é UTF-8?

Se ler sobre XeTeX ou LuaTeX, é quase certo que irá encontrar explicações que afirmam que esses motores TeX leem texto e ficheiros de entrada LaTeX em “formato UTF-8”. Então, o que é o “formato UTF-8” e como se relaciona com Unicode? Na terminologia Unicode, cada um dos seus 1,114,112 valores (variando de 0 a 1,114,111) usados para codificar os caracteres do mundo é chamado um [ponto de código](http://www.unicode.org/glossary/#code_point).

Vimos que, *em teoria*, precisaríamos de armazenar todo o nosso texto codificado em Unicode usando 4 bytes por caractere para representar a gama completa dos pontos de código Unicode. No entanto, na prática, algumas pessoas bastante inteligentes inventaram uma forma simples de representar um único número Unicode (ponto de código) como uma *sequência* de números mais pequenos, cada um desses números mais pequenos é armazenado num único byte: um processo que *transforma* um único inteiro (maior) numa sequência de outros mais pequenos (do tamanho de um byte). Devido a esta transformação, os caracteres do nosso ficheiro de texto já não são cada um representados por um único valor numérico: cada caractere torna-se uma *sequência multibyte*—qualquer coisa entre 1 e 4 bytes (consecutivos) no ficheiro de texto pode representar um único caractere Unicode individual (ou seja, o valor do seu ponto de código).

UTF significa *Formato de Transformação Unicode* e a palavra-chave aqui é *Transformação*. Em essência, pode pensar em UTF-8 como uma “receita” ou algoritmo para converter (transformar) um único valor de ponto de código Unicode numa sequência de 1 a 4 pedaços do tamanho de um byte. À medida que o valor do ponto de código Unicode aumenta, também aumenta o número de bytes individuais necessários para o representar em formato UTF-8.

Existem razões técnicas e históricas para a criação do UTF-8 e a história por trás da invenção do UTF-8 está [registada num fascinante e-mail de 2003](https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt), que, perto do início do e-mail, contém a linha:

> “Isso não é verdade. O UTF-8 foi concebido, à frente dos meus olhos, numa toalha de papel num restaurante de New Jersey, numa noite de setembro de 1992, ou por volta disso.”

#### Exemplo: a letra árabe ل

Vamos tomar como exemplo a letra árabe ل (nome Unicode LETRA ÁRABE LAM), à qual é atribuído o valor de ponto de código Unicode 1604 (decimal) ou 0644 (hexadecimal): a sua representação em UTF-8 é a *sequência de dois bytes* D9 84 (hex) ou, em decimal, 217 132. Ao usar UTF-8 como formato para armazenar texto, em vez de um ficheiro de texto contendo o número único 1604 para representar ل, este é convertido em dois valores do tamanho de um byte: 217 e 132 — o caractere ل é armazenado como uma *sequência de dois bytes*. Os leitores que queiram explorar o algoritmo UTF-8 com mais detalhe podem encontrar uma explicação aprofundada, e código C, no meu [site pessoal do blogue deste autor](http://www.readytext.co.uk/?p=1284).

Quando um pedaço de software (por exemplo, XeTeX ou LuaTeX) lê texto em formato UTF-8, esse software precisa de determinar o valor Unicode de cada caractere presente nesse ficheiro, por isso usa um algoritmo para *reverter* reverter o processo de transformação UTF-8. Através desse “algoritmo de reversão”, os dois bytes (217 e 132) são recombinados para gerar o inteiro 1604, que pode então ser reconhecido como o valor de ponto de código Unicode da letra árabe ل.

Portanto, em conclusão, o UTF-8 é realmente apenas um formato de dados intermédio usado para o armazenamento e transmissão de texto codificado em Unicode.

**Nota**: Alguns sistemas optam por usar/armazenar texto usando 32 bits por caractere, isto chama-se [UTF-32](https://en.wikipedia.org/wiki/UTF-32)—há também [UTF-16](https://en.wikipedia.org/wiki/UTF-16) mas o UTF-8 é a forma mais comum de armazenar texto codificado em Unicode.

## Ficheiros TeX multilingues: XeTeX e LuaTeX

Tanto XeTeX como LuaTeX são capazes de uma composição tipográfica multilingue muito sofisticada, embora os seus mecanismos para o conseguir sejam bastante diferentes e reflitam a filosofia de design/desenvolvimento de cada motor. Não exploraremos isto em profundidade, limitando-nos a notar que o motor XeTeX contém componentes de software (integrados no seu executável) que não estão presentes no LuaTeX — mais notavelmente software para um processo chamado *conformação OpenType* (por exemplo, através de uma biblioteca chamada [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)).

LuaTeX, por contraste, adota uma abordagem diferente: em vez de incorporar capacidades diretamente no próprio motor TeX, o LuaTeX fornece uma coleção extremamente rica de comandos (primitivos TeX) e uma API baseada em Lua muito poderosa [API baseada em Lua](/latex/overleaf-learn-latex-pt/artigos-aprofundados/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md) através da qual os programadores podem construir soluções igualmente avançadas para composição tipográfica multilingue. Embora a filosofia do LuaTeX possa implicar trabalho adicional para os desenvolvedores de pacotes LaTeX, proporciona uma grande flexibilidade adicional porque as soluções não estão “codificadas de forma rígida” no próprio motor LuaTeX, mas são construídas a partir de código TeX e Lua — ou de plugins escritos em C/C++.

**Nota à parte**: Os leitores que desejem explorar mais o fascinante, mas complexo, mundo da conformação OpenType poderão interessar-se por ler sobre a excelente biblioteca de código aberto chamada [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)—utilizada por muitas aplicações, incluindo Firefox, Chrome e LibreOffice e, claro, pelo XeTeX. O autor deste artigo usou o HarfBuzz para criar [plugins LuaTeX para compor texto árabe](http://www.readytext.co.uk/?p=3186).

Hoje em dia é comum (por exemplo, nas redes sociais) transmitir texto que contém caracteres de múltiplas línguas e um ficheiro de texto UTF-8 que armazena texto multilingue pode facilmente conter caracteres cuja representação em UTF-8 tem 1, 2, 3 ou 4 bytes de comprimento. Portanto, na prática, um ficheiro de texto UTF-8 é apenas um fluxo de bytes individuais, mas cada caractere real nesse ficheiro pode ter qualquer coisa entre 1 e 4 bytes de comprimento: os caracteres individuais tornaram-se *sequências multibyte*.

Para explorar mais alguns aspetos-chave do trabalho com texto multilingue (na composição tipográfica) usaremos um exemplo que contém a escrita árabe, porque o árabe oferece-nos espaço para abordar múltiplos conceitos.

#### Nota à parte: a escrita árabe

O [Escrita árabe](https://en.wikipedia.org/wiki/Arabic_script) é escrita num estilo cursivo que é lido e escrito da direita para a esquerda. Cada letra árabe pode, potencialmente, adotar uma de 4 formas diferentes de acordo com:

* se é exibida como um caractere único, isolado (independente), não ligado a mais nada;
* se ocorre dentro de uma palavra — no início, meio ou fim de uma palavra: designado por *inicial*, *medial* e *final* formas, respetivamente.

Cada caractere da escrita árabe tem o seu próprio conjunto de regras de ligação e pode, ou não, alterar a forma/aparência quando tem outro caractere à sua esquerda, à direita ou à sua esquerda e direita. Os leitores interessados em explorar isto mais a fundo podem encontrar uma [lista completa na Wikipédia](https://en.wikipedia.org/wiki/Template:Arabic_alphabet_shapes/joining).

#### Exemplo: texto árabe e inglês em UTF-8

Suponha que criamos um ficheiro de texto UTF-8 contendo uma única linha de texto em inglês e árabe: Isto é العَرَبِيَّة texto!

Esta linha de texto contém 3 caracteres de espaço, 11 caracteres em inglês (escrita latina) e 12 caracteres árabes (embora isso possa não ser imediatamente óbvio/aparente). Quando guardada como ficheiro de texto UTF-8, ocupa 38 bytes de armazenamento, resultantes do seguinte:

* **Escrita latina**: espaços mais texto em inglês: 14 ✕ caracteres de 1 byte = 14 bytes;
* **Escrita árabe**: 12 caracteres árabes ✕ 2 bytes por caractere = 24 bytes.

Um total de 14 + 24 = 38 bytes.

#### A aprofundar

Se guardarmos o nosso texto de exemplo num ficheiro UTF-8 chamado `arabic.txt` e o abrirmos num editor hexadecimal, podemos examiná-lo para ver os bytes reais que contém. A partir do estudo da seguinte captura de ecrã anotada, pode ver que o texto árabe é armazenado como 2 bytes por caractere:

![Um ficheiro de texto UTF-8 contendo texto em inglês e árabe aberto num editor hexadecimal.](/files/47346a1740046214ae6aef801f8b583b80c7ba73)

Um ficheiro de texto UTF-8 contendo texto em inglês e árabe aberto num editor hexadecimal. Pode ver claramente que os caracteres da escrita latina requerem um único byte, mas os caracteres da escrita árabe são armazenados usando dois bytes por caractere.

Pode fazer algumas observações a partir desta captura de ecrã:

* o texto árabe é armazenado numa sequência da esquerda para a direita e os caracteres são as versões brutas, não moldadas (isoladas) das letras e vogais árabes;
* não existe informação adicional após a escrita latina “Isto é ” para informar qualquer software que leia este ficheiro de que o próximo caractere está na escrita árabe.

Se estiver a compor um documento multilingue (por exemplo, contendo inglês e árabe), então durante a leitura/processamento do ficheiro de texto de entrada (como um fluxo de bytes) o XeTeX ou LuaTeX tem de ser capaz de detetar o início e o fim de cada caractere e ler o número correto de bytes necessário para reverter a transformação UTF-8 e gerar o ponto de código Unicode correspondente. É o próprio algoritmo UTF-8 que permite ao software fazer isto: permitindo a deteção do primeiro byte de cada caractere individual e de quantos bytes precisam de ser lidos para calcular o ponto de código Unicode correspondente. O UTF-8 é simples de usar, mas realmente bastante engenhoso.

#### Ordem lógica, ordem de apresentação e conformação OpenType

Se olhar atentamente para o árabe acima (العَرَبِيَّة), pode ser difícil ver que o nosso ficheiro de texto contém de facto 12 caracteres árabes individuais — particularmente se não estiver familiarizado com a escrita árabe! Contudo, se contar cuidadosamente os caracteres árabes apresentados no lado direito da captura de ecrã acima, pode ver que há 12 no total.

Para línguas de escrita complexa, como o árabe, aquilo que o nosso ficheiro de texto *armazena* e aquilo que você *vê no ecrã* são visivelmente *muito* bem diferentes! O que vê ao visualizar esse texto num, digamos, navegador, é (dependendo da fonte usada):

![Imagem de texto árabe composto tipograficamente](/files/817fd8874eb36ead549e369a93be3bf8d1a74a14)

Mas, como mostra a captura de ecrã acima, aquilo que o ficheiro de texto UTF-8 realmente contém é isto:

![Imagem de texto árabe não composto tipograficamente (caracteres isolados)](/files/2498f26c40b1d9a23f687edfe4a473e51b30c146)

Mesmo que não esteja familiarizado com a natureza cursiva da escrita árabe, pode ver claramente que “algo” aconteceu durante o processo de transferência dos caracteres árabes contidos num ficheiro de texto para a composição tipográfica e/ou apresentação no ecrã (como glifos). Se está habituado a usar TeX/LaTeX com línguas de escrita simples, por exemplo línguas baseadas na escrita latina, isto pode ser bastante confuso!

Alguns conceitos importantes estão aqui em jogo porque os ficheiros de texto Unicode tratam de armazenar… bem, texto (Unicode), e os sistemas de composição tipográfica e apresentação tratam de usar fontes e glifos (OpenType):

* o ficheiro de texto guardou os caracteres árabes numa ordem da esquerda para a direita, mas o árabe é lido/apresentado da direita para a esquerda: os ficheiros de texto armazenam texto na chamada *ordem lógica*;
* o ficheiro de texto contém caracteres individuais que parecem muito diferentes da apresentação real mostrada no ecrã: o ficheiro de texto contém os caracteres árabes na sua forma isolada, não ligada.

#### O que se está a passar?

Dentro de um ficheiro de texto, o árabe é armazenado como uma sequência da esquerda para a direita de caracteres na forma isolada: se pensar nisso, o ficheiro de texto armazena o texto árabe na ordem/ sequência *em que foi digitado* (o *ordem lógica*). É apenas quando esse texto é processado para apresentação, ou composto tipograficamente, que é apresentado na sua ordem de leitura correta, frequentemente referida como a *ordem visual* ou *ordem de apresentação*; além disso, as formas isoladas dos caracteres árabes são *moldadas* nas suas versões de apresentação tipograficamente corretas. Uma forma de pensar nisto é que um simples ficheiro de texto tem de armazenar texto (caracteres Unicode) na forma mais básica possível: caracteres de texto brutos, não moldados, individuais — cabe ao software de sistema apresentar esses caracteres para exibição com base no sistema operativo, nas fontes e no software de composição/renderização disponíveis no dispositivo de apresentação.

Quando o texto árabe nesse ficheiro é composto tipograficamente/exibido, sofre um processo chamado *formatação*. Os caracteres árabes individuais são convertidos em glifos moldados que representam corretamente a variante de cada caractere exigida de acordo com as regras de ligação da escrita e do sistema de escrita árabe. Além disso, software de composição tipográfica de alta qualidade (usando boas fontes OpenType) acrescentará processamento adicional aplicando sofisticação tipográfica extra através de um processo chamado *conformação OpenType*—um processo que abrange uma vasta gama de operações tipográficas que podem incluir:

* substituir vários glifos individuais por um único glifo de ligadura complexa (muito comum em árabe), ou
* operações de posicionamento que, por exemplo, ajustam as posições das vogais árabes com base no glifo acima ou abaixo do qual se encontram.

![Imagem que mostra a transformação sofrida pelo texto árabe quando é composto tipograficamente](/files/9268cc9334b1ea1ec30d7252f9f28115af2c49ef)

A diferença entre a ordem lógica e a ordem visual (de apresentação). Neste gráfico, pode ver que os caracteres árabes armazenados num ficheiro de texto sofrem reordenação e formatação quando são apresentados ou compostos tipograficamente.

Os designers e criadores de fontes OpenType avançadas investem muito tempo e conhecimento especializado para disponibilizar as capacidades tipográficas sofisticadas incorporadas nas suas fontes.

Para desativar a formatação aplicada ao texto árabe, podemos usar o excelente, gratuito, [BabelPad](http://www.babelstone.co.uk/Software/BabelPad.html) editor de texto Unicode (apenas Windows) que permite desativar a formatação para ver os caracteres brutos, individuais e não ligados (sem forma) efetivamente presentes no ficheiro de texto—veja a metade inferior desta captura de ecrã combinada:

![Imagem que mostra a capacidade do editor de texto BabelPad de desativar a formatação OpenType](/files/14f70656e08bcabb208f1d9dbca9c5f5f97a2718)

Utilizar o editor de texto Unicode BabelPad para ativar a formatação OpenType (figura superior) ou desativá-la (figura inferior). Desativar a formatação OpenType torna muito mais fácil editar texto árabe.

Os conceitos de ordem lógica e ordem de apresentação, aliados aos processos de formatação, podem ser bastante confusos quando os encontra pela primeira vez durante a edição ou composição tipográfica com ficheiros de texto multilingues que contêm sistemas de escrita complexos, como o árabe: esperemos que o exposto acima tenha ajudado a evitar alguma confusão inicial.


---

# 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/overleaf-learn-latex-pt/artigos-aprofundados/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.
