1. Introdução
Imagine que você é um diplomata numa cúpula internacional: cada um fala sua própria língua e usa sua própria escrita. Para se entender, é preciso um tradutor universal — um conjunto comum de regras que mapeia caracteres. Nos computadores essa função é feita pelas codificações.
O computador entende apenas uma "língua" — sequências de zeros e uns. 0 e 1 — esse é o seu "alfabeto". Toda a informação é armazenada e transmitida como bytes. Um byte é 8 bits (por exemplo, 01000001).
Como ligar nossas letras e sinais aos bytes? Como o computador sabe que a letra "A" não é só um conjunto de 0/1, mas sim o caractere que deve aparecer na tela?
Codificação
Codificação é um conjunto de regras (uma tabela de mapeamento) que define como cada símbolo (letra, número, sinal, ideograma, emoji) é convertido em uma sequência de bytes e como esses bytes são interpretados de volta em símbolos.
Analogamente ao código Morse: você traduz o texto em pontos e traços, envia a mensagem, e o receptor, seguindo as mesmas regras, reconstrói os símbolos. No computador, o acordo "bytes ↔ símbolos" é a codificação.
2. Por que essa dor de cabeça com codificações?
- Tradução entre o mundo humano e o da máquina: sem codificação, texto é só uma sequência de bytes; com codificação, são símbolos significativos.
- Universalidade e compatibilidade: programas e sistemas operacionais precisam "entrar em acordo" sobre as regras. Se um arquivo é declarado como UTF-8, ele também precisa ser lido como UTF-8.
- Suporte para muitos idiomas e símbolos: cirílico, escrita árabe, ideogramas, símbolos matemáticos, emoji — quanto maior o conjunto de símbolos, mais complexa e flexível precisa ser a codificação.
3. ASCII – a codificação "primitiva"
Uma das codificações mais antigas e básicas é ASCII (American Standard Code for Information Interchange). Ela usa 7 bits por símbolo, ou seja, pode representar 128 símbolos diferentes: o alfabeto latino (A-Z, a-z), dígitos (0-9), sinais de pontuação e códigos de controle (por exemplo, nova linha, tab).
| Símbolo | Código decimal (ASCII) | Código binário (7 bits) |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Espaço | |
|
Historicamente o oitavo bit muitas vezes servia como bit de paridade, e depois começaram a usar esse bit em "extensões" do ASCII — assim surgiram vários conjuntos de um byte para diferentes locais, o que levou à bagunça.
Se você escrever "Hello", no disco isso vai ficar mais ou menos assim (1 byte por caractere; para o ASCII de 7 bits o bit mais significativo é zero):
H (01001000) e (01100101) l (01101100) l (01101100) o (01101111)
Simples. Mas e as letras cirílicas ou os ideogramas? No ASCII eles não existem — é um "dicionário monolíngue", útil só para o conjunto latino básico.
4. "Caracteres estranhos" — por que codificação não é brincadeira
Às vezes, ao abrir um arquivo, você vê algo como Привет em vez de "Privet". Isso se chama "caracteres estranhos" (ou Mojibake) — o resultado de ler bytes com a codificação errada.
Suponha que você salvou "Privet, mir!" na codificação Windows-1251, onde os bytes para as letras de "Privet" podem ser assim (simplificado):
- P → 207
- r → 240
- i → 232
- v → 226
- e → 229
- t → 242
Aí seu colega abriu o arquivo num editor que esperava ISO-8859-1 (Latin-1), ou você usou StreamReader sem especificar a codificação, e ela não bateu com a do arquivo. Resultado: o byte 207 é interpretado como um símbolo de outra tabela — e o texto "quebra".
| Símbolo original (Windows-1251) | Representação em bytes (exemplo) | Símbolo lido como ISO-8859-1 |
|---|---|---|
| P | |
Ç |
| r | |
à |
| i | |
è |
| v | |
â |
| e | |
å |
| t | |
ò |
No fim das contas obtemos Çàèâåò em vez de "Privet". Se um símbolo simplesmente não existe na codificação esperada, você vai ver quadrados ou pontos de interrogação.
Conclusão prática: ao ler/escrever textos é importante especificar a codificação explicitamente, especialmente se a origem dos dados não é controlada por você. No .NET isso é feito via StreamReader/StreamWriter com a Encoding correta (por exemplo, UTF-8 ou Encoding.GetEncoding("windows-1251")). Isso ajuda a evitar "caracteres estranhos" e garante troca de dados correta entre sistemas.
Nas próximas aulas vamos aprender a escolher e especificar a codificação ao trabalhar com arquivos e streams, para que seu código seja versátil, internacional e confiável.
GO TO FULL VERSION