O que é o Unicode

O que é o Unicode

Você nunca percebe que digitar texto no computador pode ser complicado até que você tenha que lidar com outros idiomas. Veja como o Unicode ajuda nesses casos.

Todos nós sabemos como digitar texto no teclado. Não é?

Então, vamos desafiá-lo a digitar esse texto em seu editor de texto favorito:

text-challenge

Este texto é um desafio para digitar, uma vez que contém:

  • sinais tipográficos não diretamente disponíveis no teclado,
  • caracteres japoneses,
  • o nome da capital japonesa escrito com um macron em cima das duas letras "o" para cumprir com o padrão de romanização de Hepburn,
  • e, finalmente, o primeiro nome Dmitrii escrito usando o alfabeto cirílico.

Sem dúvida, escrever tal frase nos primeiros computadores teria sido simplesmente impossível. Porque os computadores usavam conjuntos de caracteres limitados, incapazes de deixar coexistir vários sistemas de escrita. Mas hoje tais limitações são levantadas, como veremos neste artigo.

Como os computadores armazenam texto?

Os computadores armazenam caracteres como números. E eles usam tabelas para mapear esses números para o glifo usado para representá-los.

Durante muito tempo, os computadores armazenaram cada caractere como um número entre 0 e 255 (que se encaixa exatamente em um byte). Mas isso estava longe de ser suficiente para representar todo o conjunto de caracteres usados na escrita humana. Então, o truque era usar uma tabela de correspondência diferente, dependendo de onde no mundo você morava.

Aqui está a tabela de correspondência ISO 8859-15 comumente usada na França:

ISO_8859-15

Mas se você morasse na Rússia, seu computador provavelmente teria usado a codificação KOI8-R ou Windows-1251. Vamos supor que mais tarde foi usado:

Windows-1251

Para números inferiores a 128, as duas tabelas são idênticas. Esse intervalo corresponde ao padrão US-ASCII, algum tipo de conjunto mínimo compatível entre tabelas de caracteres. Mas além de 128, as duas tabelas são completamente diferentes.

Por exemplo, de acordo com o Windows-1251, a cadeia de caracteres "said Дмитрий" é armazenada como:

115 97 105 100 32 196 236 232 242 240 232 233

Para seguir uma prática comum em ciências da computação, esses doze números podem ser reescritos usando a notação hexadecimal mais compacta:

73 61 69 64 20 c4 ec e8 f2 f0 e8 e9

Se o Dmitrii me enviar esse arquivo, e eu abri-lo, posso acabar vendo que:

said Äìèòðèé

O arquivo parece estar corrompido. Mas não é. Os dados, ou seja, os números, armazenados nesse arquivo, não foram alterados. Se eu moro na França, meu computador assumiu que o arquivo deve ser codificado como ISO8859-15. E exibia os caracteres dessa tabela correspondentes aos dados. E não o caractere da tabela de codificação usada quando o texto foi originalmente escrito.

Para dar um exemplo, pegue o caractere Д. Tem o código numérico 196 (c4) de acordo com o Windows-1251. A única coisa armazenada no arquivo é o número 196. Mas esse mesmo número corresponde a Ä de acordo com a ISO8859-15. Então, o computador erroneamente acreditou que era o glifo destinado a ser exibido.

windows-1251-to-iso8859-15-encoding-decoding-error-example

Como uma nota lateral, você ainda pode ocasionalmente ver uma ilustração desses problemas em sites mal configurados ou em e-mails enviados por agentes de usuário de email fazendo suposições falsas sobre a codificação de caracteres usada no computador do destinatário. Tais falhas às vezes são apelidadas de mojibake. Esperamos que isso seja cada vez menos frequente hoje.

Mojibake-french-example

Unicode vem para salvar o dia

Explicamos problemas de codificação ao trocar arquivos entre diferentes países. Mas as coisas eram ainda piores, já que as codificações usadas por diferentes fabricantes para o mesmo país nem sempre eram as mesmas. Você pode entender o que queremos dizer se você teve que trocar arquivos entre Mac e PC nos anos 80.

É uma coincidência ou não, o projeto Unicode começou em 1987, liderado por pessoas da Xerox e ... Apple.

O objetivo do projeto era definir um conjunto de caracteres universais que permitisse simultaneamente usar qualquer caractere usado na escrita humana dentro do mesmo texto. O projeto Unicode original foi limitado a 65536 caracteres diferentes (cada caractere sendo representado usando 16 bits — ou seja, dois bytes por caractere). Um número que se revelou insuficiente.

Assim, em 1996, o Unicode foi estendido para suportar até 1 milhão de diferentes pontos de código. Grosso modo, um "ponto de código" um número que identifica uma entrada na tabela de caracteres Unicode. E um trabalho principal do projeto Unicode é fazer um inventário de todas as letras, símbolos, sinais de pontuação e outros caracteres que são (ou foram) usados em todo o mundo e atribuir a cada um deles um ponto de código que identificará exclusivamente esse caractere.

Este é um grande projeto: para se ter uma ideia, a versão 10 do Unicode, publicada em 2017, define mais de 136.000 caracteres cobrindo 139 scripts modernos e históricos.

Com um número tão grande de possibilidades, uma codificação básica exigiria 32 bits (ou seja, 4 bytes) por caractere. Mas para texto usando principalmente os caracteres no intervalo US-ASCII, 4 bytes por caractere significa 4 vezes mais armazenamento necessário para salvar os dados e 4 vezes mais largura de banda para transmiti-los.

unicode-utf-32-encoding-example

Assim, além da codificação UTF-32, o consórcio Unicode definiu as codificações UTF-16 e UTF-8 mais eficientes em termos de espaço, usando respectivamente 16 e 8 bits. Mas como armazenar mais de 100.000 valores diferentes em apenas 8 bits? Bem, você não pode. Mas o truque é usar um valor de código (8 bits em UTF-8, 16 em UTF-16) para armazenar os caracteres usados com mais frequência. E usar vários valores de código para os caracteres menos usados. Assim, UTF-8 e UTF-16 são codificações de comprimento variável. Mesmo que isso tenha desvantagens, o UTF-8 é um bom compromisso entre a eficiência do espaço e do tempo. Sem mencionar ser compatível com versões anteriores com a maioria das codificações pré-Unicode de 1 byte, uma vez que o UTF-8 foi projetado especificamente para que qualquer arquivo US-ASCII válido também seja um arquivo UTF-8 válido. Em certo sentido, UTF-8 é um superconjunto de US-ASCII. E hoje, não há razão para não usar a codificação UTF-8. A menos, é claro, se você escrever principalmente com linguagens que exigem codificações de vários bytes ou se você tiver que lidar com sistemas legados.

Deixamos você comparar a codificação UTF-16 e UTF-8 da mesma cadeia de caracteres nas ilustrações abaixo. Preste atenção especial à codificação UTF-8 usando um byte para armazenar os caracteres do alfabeto latino. Mas usando dois bytes para armazenar caracteres do alfabeto cirílico. Isso é duas vezes mais espaço do que ao armazenar os mesmos caracteres usando a codificação cirílica do Windows-1251.

unicode-utf-16-encoding-example

unicode-utf-8-encoding-example

E como isso ajuda a digitar texto?

Bem... Não faz mal ter algum conhecimento do mecanismo subjacente para entender os recursos e limitações do seu computador. Especialmente falaremos sobre Unicode e hexadecimal um pouco mais tarde. Mas por enquanto... um pouco mais de história. Só um pouquinho...

... apenas o suficiente para dizer que a partir dos anos 80, o teclado do computador costumava ter uma tecla de composição (às vezes rotulada como a tecla "multi") ao lado da tecla shift. Ao pressionar essa tecla, você entrou no modo "compor". E uma vez nesse modo, você foi capaz de inserir caracteres não diretamente disponíveis no seu teclado, digitando mnemônicos em vez disso. Por exemplo, no modo de composição, digitar RO produziu o caractere ® (que é fácil de lembrar como um R dentro de um O).

compose_key_on_lk201_keyboard

Tecla Compose no teclado LK 201

Agora é uma raridade ver a tecla de composição em teclados modernos. Provavelmente por causa da dominação de PCs que não fazem uso dele. Mas no Linux (e possivelmente em outros sistemas?) você pode emular a tecla de composição. Isso é algo que pode ser configurado na inerface gráfica em muitos ambientes de desktop usando o painel de controle "Teclado": Mas o procedimento exato varia dependendo do seu ambiente de desktop ou mesmo dependendo de sua versão. Se você alterou essa configuração, não hesite em usar a seção de comentários para compartilhar as etapas específicas que você seguiu em seu computador.

Aqui, vamos assumir que você use a combinação padrão Shift + AltGr para emular a tecla de composição.

Então, como um exemplo prático, para inserir LEFT-POINTING DOUBLE ANGLE QUOTATION MARK, você pode digitar Shift + AltGr << (você não precisa manter Shift + AltGr pressionado ao inserir o mnemônico). Se você conseguiu fazer isso, acho que você deve ser capaz de adivinhar por si mesmo como digitar RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK.

Como outro exemplo, tente Shift + AltGr --- para produzir um EM DASH. Para que isso funcione, você tem que pressionar a tecla hífen-menos no teclado principal, não a que você encontrará no teclado numérico.

Vale a pena mencionar que a chave "compor" também funciona em um ambiente não gráfico. Mas, dependendo se você usar, você usa o X11 ou um console somente de texto, a sequência de teclas de composição suportada não é a mesma.

No console, você pode verificar a lista de teclas de composição com suporte usando o comando dumpkeys:

Comandos para usar no terminal

dumpkeys --compose-only

Na interface gráfica, a tecla de composição é implementada no nível Gtk/X11. Para obter uma lista de todos os mnemônicos suportados pelo Gtk, dê uma olhada nessa página: https://help.ubuntu.com/community/GtkComposeTable

Existe uma maneira de evitar depender do Gtk para a composição de carecteres?

Talvez sendo purista, alguém pode pensar que é infeliz o suporte à teclas de composição ser codificado no Gtk. Afinal, nem todos os aplicativos GUI estão usando essa biblioteca. Não podemos adicionar mnemônicos próprios sem recompilar o Gtk.

Temos suporte para a composição de caracteres no nível X11 também. Anteriormente, através do venerável X Input Method (XIM).

Isso funcionará em nível inferior à composição de caracteres baseada em Gtk. Mas permitirá uma grande quantidade de flexibilidade. E funcionará com muitos aplicativos X11.

Por exemplo, vamos imaginar que eu só quero adicionar a composição --> para inserir o caractere → (U + 2192 RIGHTWARDS ARROW), eu criaria um arquivo ~/.XCompose contendo essas linhas:

cat > ~/.XCompose << EOT
# Load default compose table for the current local
include "%L"

# Custom definitions
<Multi_key> <minus> <minus> <greater> : U2192 # RIGHTWARDS ARROW
EOT

Em seguida, você pode testar iniciando um novo aplicativo X11, forçando as bibliotecas a usar XIM como método de entrada:

Comandos para usar no terminal

GTK_IM_MODULE="xim" QT_IM_MODULE="xim" xterm

A nova sequência de composição deve estar disponível no aplicativo que você iniciou. Eu encorajo você a aprender mais sobre o formato de arquivo de composição digitando man 5 compose.

Para tornar o XIM o método de entrada padrão para todos os seus aplicativos, basta adicionar ao arquivo ~/.profile as duas linhas a seguir. essa alteração entrará em vigor na próxima vez que você abrir uma sessão no computador:

export GTK_IM_MODULE="xim"
export QT_IM_MODULE="xim"

É bem legal, não é? Dessa forma, você pode adicionar todas as sequências de composição que desejar. E já existem alguns engraçados nas configurações padrão do XIM. Tente, por exemplo, pressionar compose LLAP.

Bem, devemos mencionar duas desvantagens. O XIM é relativamente antigo e provavelmente só é adequado para aqueles de nós que não precisam regularmente de métodos de entrada de vários bytes. Em segundo lugar, ao usar XIM como seu método de entrada, você não pode mais inserir caracteres Unicode por seu ponto de código usando a sequência Ctrl + Shift + u. Que? Espere um minuto? Não falamos sobre isso ainda? Então vamos fazer isso agora:

E se não houver uma sequência de teclas de composição para o caractere que eu preciso?

A tecla de composição é uma boa ferramenta para digitar alguns caracteres não disponíveis no teclado. Mas o conjunto padrão de combinações é limitado, e mudar para XIM e definir uma nova sequência de composição para um personagem que você precisará apenas uma vez na vida pode ser complicado.

Isso impede que você misture caracteres japoneses, latinos e cirílicos no mesmo texto? Certamente não, graças ao Unicode. Por exemplo, o nome あゆみ é feito de:

Eu mencionei acima os nomes oficiais de caracteres Unicode, seguindo a convenção para escrevê-los em todas as letras maiúsculas. Após o nome, você encontrará seu ponto de código Unicode, escrito entre parênteses, como um número hexadecimal de 16 bits. Isso te lembra alguma coisa?

De qualquer forma, uma vez que você sabe o ponto de código de um caractere, você pode inseri-lo usando a seguinte combinação:

  • Ctrl + Shift + u, depois XXXX (o ponto de código hexadecimal do caractere desejado) e, finalmente, Enter.

Como uma abreviação, se você não soltar Ctrl + Shift ao inserir o ponto de código, não será necessário pressionar Enter.

Infelizmente, esse recurso é implementado no nível da biblioteca de software, e não no nível X11. Portanto, o suporte pode ser variável entre diferentes aplicativos. No LibreOffice, por exemplo, você precisa digitar o ponto de código usando o teclado principal. Considerando que o aplicativo baseado em Gtk também aceitará a entrada do teclado numérico.

Finalmente, ao trabalhar no console no sistema Debian, há um recurso semelhante, mas exigindo em vez disso pressionar Alt + XXXXX onde XXXXX é o ponto de código do caractere que você deseja, mas escrito em decimal desta vez. Será que isso é específico do Debian ou relacionado ao fato de usar o en_US UTF-8 ?. Se você tiver mais informações sobre isso, deixe na seção de comentários!

Interface gráfica Console Caractere
Ctrl + Shift + u 3042 Enter Alt + 12354
Ctrl + Shift + u 3086 Enter Alt + 12422
Ctrl + Shift + u 307F Enter Alt + 12415

Teclas mortas

Por último, mas não menos importante, existe um método mais simples para inserir combinações de teclas que não dependem (necessariamente) da tecla de composição.

Algumas teclas do teclado foram projetadas especificamente para criar uma combinação de caracteres. Essas são chamadas de teclas mortas. Porque quando você os pressiona uma vez, nada parece acontecer. Mas eles modificarão silenciosamente o caractere produzido pela próxima tecla que você pressionar. Este é um comportamento inspirado na máquina de escrever mecânica: com eles, pressionar uma tecla morta imprimia um caractere, mas não move o cursor. Assim, o próximo pressionamento de tecla imprimirá outro caractere na mesma posição. Visualmente resultando em uma combinação das duas teclas pressionadas.

Isso é muito usado em português. Por exemplo, para introduzir a letra "é" temos de pressionar a tecla morta ' seguida da tecla e. Dessa forma, temos algumas teclas como a tecla ~ morta no teclado ABNT. E no layout do teclado para idiomas nórdicos, você pode encontrar a tecla °. E poderiamos continuar essa lista por muito tempo.

hungary_dead_keys

Obviamente, nem todas as teclas mortas estão disponíveis em todos os teclados. De fato, a maioria das teclas mortas NÃO estão disponíveis no seu teclado. Por exemplo, muito poucos dos leitores desse artigo – se houver – têm uma tecla morta ̄ para entrar no macron ("acento plano") usado para escrever Tōkyō.

Para aquelas teclas mortas que não estão diretamente disponíveis no seu teclado, você precisa recorrer a outras soluções. A boa notícia é que já usamos essas técnicas. Mas desta vez vamos usá-los para emular teclas mortas. Não teclas "comuns".

Então, uma primeira opção poderia ser gerar a tecla morta macron usando Compose - (a tecla hífen-menos disponível no seu teclado). Nada aparece. Mas se depois disso você pressionar a tecla o, ela finalmente produzirá "ō".

A lista de teclas mortas que o Gtk pode produzir usando o modo de composição pode ser encontrada aqui.

Uma solução diferente usaria o caractere Unicode COMBINING MACRON (U+0304). Seguida da letra o. Vamos deixar os detalhes para você. Mas se você está curioso, você pode descobrir que isso leva a um resultado muito sutilmente diferente, em vez de realmente produzir uma LATIN SMALL LETTER O WITH MACRON. E se escrevemos o final da frase anterior em letras maiúsculas, esta é uma dica que o guia em direção a um método para inserir ō com menos pressionamentos de tecla do que usando um caractere de combinação Unicode... Mas deixams isso para a sua sagacidade.

Sua vez de praticar!

E aí, entendeu tudo? Isso funciona no seu computador? É a sua vez de tentar isso: usando as pistas dadas acima, e um pouco de prática, agora você pode entrar no texto do desafio dado no início deste artigo. Faça isso e, em seguida, copie e cole seu texto na seção de comentários abaixo como prova de seu sucesso.

Não há nada a perder, aliás, talvez ganhe a satisfação de impressionar seus colegas!

Última atualização deste artigo: 13 de december de 2022