A codificação de carateres e por que o UTF-8 prevaleceu

  • VersionDude
  • Padrões
  • 5 min de leitura

O mojibake, os acentos partidos e os símbolos «» reconduzem-se todos à codificação. Eis o que é o UTF-8 e por que é o padrão predefinido da web moderna.

Os computadores não armazenam letras; armazenam números. Uma codificação de carateres é simplesmente o acordo sobre que número significa que carater, para que o byte registado por um programa seja relido como a mesma letra por outro. Quando este acordo se mantém, o texto funciona simplesmente; quando se quebra, o resultado é aquela confusão sem nexo familiar que aflige a informática desde os seus primeiros dias.

Quando um documento é escrito com uma codificação e lido com outra, obtém o mojibake — os acentos baralhados, os quadradinhos misteriosos e os pontos de interrogação que toda a gente já viu num momento ou noutro. Um «café» torna-se «café», uma aspa curva transforma-se numa sucessão de símbolos, e uma página inteira noutra língua pode dissolver-se em algo sem nexo. A causa subjacente é sempre a mesma: o escritor e o leitor estavam em desacordo sobre que número representa que carater.

Do ASCII a um mosaico de codificações

Um conjunto de tipos de letra em carateres.
Um conjunto de tipos de letra em carateres.

As raízes do problema residem nas codificações limitadas dos primórdios da informática. O ASCII, um dos esquemas fundadores, cobria apenas o inglês — as letras latinas de base, os algarismos e um punhado de símbolos — porque usava uma pequena gama de números. Era suficiente para os primórdios da informática americana mas não deixava espaço para as letras acentuadas, e ainda menos para as escritas da maioria das línguas do mundo.

O que se seguiu foi um mosaico de codificações de 8 bits incompatíveis, cada uma comprimindo um conjunto diferente de carateres adicionais no mesmo espaço limitado. Uma codificação cobria os acentos da Europa Ocidental, outra o cirílico, outra o grego, e assim por diante, com o mesmo número a significar carateres diferentes em cada uma. Um documento só fazia sentido se se soubesse exatamente qual destas codificações usava, e errar produzia o mojibake — uma situação frágil e propensa a erros.

Como o Unicode resolveu o problema de fundo

O Unicode resolveu o problema subjacente na sua raiz. Em vez de recortar um pequeno espaço de números, atribui a cada carater de cada escrita — latina, cirílica, árabe, chinesa, emoji e muito mais — o seu próprio ponto de código único. O Unicode é o catálogo universal: uma identidade única e acordada para cada carater que a humanidade escreve, eliminando a ambiguidade que condenou o velho mosaico de codificações.

Vale a pena separar duas ideias fáceis de confundir, porque a distinção é a chave para compreender o assunto. O Unicode define os pontos de código — os números abstratos atribuídos aos carateres — mas não diz por si só como estes números são transformados em bytes no disco ou na rede. Esta segunda tarefa, fazer corresponder os pontos de código a bytes reais, é o papel de uma codificação, e o UTF-8 é a codificação que o faz.

Por que o UTF-8 conquistou a web

O UTF-8 prevaleceu sobre as alternativas por várias razões concretas. É retrocompatível com o ASCII, pelo que qualquer texto em inglês simples é já UTF-8 válido sem qualquer alteração. É económico em espaço para o texto comum, usando um único byte para os carateres mais frequentes e mais apenas quando é necessário. E pode representar cada carater Unicode, de modo que uma única codificação basta finalmente para todas as línguas ao mesmo tempo.

Estas propriedades combinadas fizeram do UTF-8 a predefinição esmagadora da web moderna, e o padrão HTML recomenda declará-lo explicitamente. A convenção é colocar uma declaração <meta charset="utf-8"> perto do topo de cada documento, o que indica ao navegador sem ambiguidade como interpretar os bytes que se seguem. Declará-lo elimina toda a conjetura e impede o navegador de recuar para uma hipótese errada.

Estas propriedades combinadas fizeram do UTF-8 a predefinição esmagadora da web moderna, e o padrão HTML recomenda declará-lo explicitamente. A convenção é colocar uma declaração <meta charset="utf-8"> perto do topo de cada documento, o que indica ao navegador sem ambiguidade como interpretar os bytes que se seguem. Declará-lo elimina toda a conjetura e impede o navegador de recuar para uma hipótese errada.

— VersionDude

Onde os bugs ainda se insinuam

Saltar esta declaração, ou deixar as camadas contradizerem-se, é exatamente onde os problemas ainda se insinuam hoje. Se um ficheiro é registado numa codificação mas servido com um cabeçalho que reivindica outra, ou renderizado sem qualquer declaração, um navegador pode adivinhar de forma incorreta e reintroduzir o próprio mojibake que o Unicode devia eliminar. Os erros são quase sempre uma discordância entre as camadas, e não um defeito do próprio UTF-8.

O conselho prático é, portanto, de uma simplicidade tranquilizadora: registe os seus ficheiros em UTF-8, sirva-os em UTF-8, e declare UTF-8. Faça com que estes três elementos concordem e toda uma categoria de bugs de codificação frustrantes e difíceis de rastrear desaparece simplesmente. O UTF-8 prevaleceu precisamente porque torna o bom comportamento a predefinição fácil, e alinhar toda a sua cadeia por trás dele é um dos ganhos de fiabilidade menos dispendiosos do desenvolvimento web.

Projeto relacionado