
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

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.
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.



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.