Como os computadores representam texto em binário
Perceba como teclas, carateres Unicode, bytes UTF-8 e bits se relacionam, com exemplos que evitam confundir código binário com uma codificação de texto.
Do teclado aos bytes
Um computador não guarda a forma desenhada de cada letra sempre que se escreve uma mensagem. Guarda números segundo regras partilhadas. Esses números são depois codificados em bytes; os bytes, por sua vez, são representados fisicamente por estados que o hardware interpreta como bits.
Esta cadeia tem várias camadas. Dizer apenas que «a letra A é 01000001» é útil como primeiro exemplo, mas omite uma decisão essencial: qual é a codificação de carateres?
Três conceitos diferentes
- Um caráter é uma unidade de texto, como
A,áou€. - Um ponto de código Unicode identifica um caráter abstrato.
Aé U+0041 e€é U+20AC. - Uma codificação, como UTF-8 ou UTF-16, transforma pontos de código numa sequência de unidades armazenáveis.
Unicode define o repertório e os pontos de código; UTF-8 define como os representar em bytes. Não são sinónimos.
O exemplo simples: ASCII
ASCII atribui números de 0 a 127 a letras latinas básicas, algarismos, pontuação e carateres de controlo. A letra A tem o valor decimal 65:
A → ASCII 65 → hexadecimal 41 → binário 01000001
Neste caso, ASCII e UTF-8 produzem o mesmo byte. É por isso que ficheiros compostos apenas por ASCII são também UTF-8 válidos.
O exemplo deixa de chegar quando aparece á, € ou 😀: nenhum desses carateres faz parte do ASCII original.
Texto português em UTF-8
Em UTF-8, os primeiros 128 pontos de código ocupam um byte. Outros pontos de código ocupam entre dois e quatro bytes. Por exemplo:
| Texto | Ponto de código | Bytes UTF-8 em hexadecimal | Bits por byte |
|---|---|---|---|
A |
U+0041 | 41 |
01000001 |
á |
U+00E1 | C3 A1 |
11000011 10100001 |
€ |
U+20AC | E2 82 AC |
11100010 10000010 10101100 |
O á não é «um caráter de 16 bits» por natureza. Tem um ponto de código, mas a quantidade e a forma dos bytes dependem da codificação escolhida. Em UTF-8 ocupa dois bytes; em UTF-16 costuma ocupar uma unidade de código de 16 bits.
Há ainda sequências visualmente equivalentes. á pode ser o ponto de código U+00E1 ou a combinação a + U+0301. A normalização Unicode ajuda aplicações que precisam de comparar essas formas.
O que acontece ao premir uma tecla
O teclado envia um evento associado a uma tecla física. O sistema operativo e a disposição do teclado interpretam esse evento. A aplicação recebe texto; ao guardar ou transmitir esse texto, converte-o segundo uma codificação, frequentemente UTF-8.
Esta distinção explica por que motivo a mesma tecla pode produzir a, A ou outro símbolo, conforme a disposição, as teclas modificadoras e o método de introdução. O teclado não envia diretamente o byte ASCII da letra que aparece no ecrã.
Como surgem os carateres ilegíveis
O chamado mojibake aparece quando uma sequência de bytes é descodificada com regras diferentes das usadas na codificação. Se os bytes UTF-8 de á forem interpretados como Windows-1252, podem surgir dois símbolos correspondentes a U+00C3 e U+00A1 em vez da letra original.
Para resolver o problema, é preciso saber:
- quais são os bytes originais;
- que codificação os produziu;
- que codificação a aplicação assumiu;
- se houve uma conversão destrutiva intermédia.
Mudar o tipo de letra não corrige bytes mal descodificados. Um tipo de letra só desenha os carateres que a aplicação já interpretou.
Testar no conversor
No conversor de texto para binário, compare A, á, € e 😀. Conte os grupos de oito bits e observe quantos bytes UTF-8 cada exemplo produz. Depois use o conversor de binário para texto para recuperar o conteúdo.
O binário mostra os bits; UTF-8 explica como esses bits representam texto. Manter as duas ideias separadas evita a maioria dos erros de interoperabilidade.