Este documento apresenta um minicurso sobre encoding, abordando os seguintes pontos essenciais:
1) Explica o que é encoding e por que é necessário para representar informações em computadores.
2) Discorre sobre a história dos standards ASCII e Unicode e como eles lidam com a codificação de caracteres.
3) Destaca as principais diferenças entre os encodings LATIN-1 e UTF-8, sendo este último o mais usado atualmente.
7. Por que encoding?
▒ Computador é uma máquina de armazenar
e processar informação
▒ Informação é um conceito abstrato
▒ Computador não entende conceitos
abstratos
▒ Computador entende de bits, bytes,
números
12. Por que encoding?
▒ Como a gente representa uma
imagem num computador?
▒ Imagem pixels
▒ pixels números
▒ números bytes/bits
▒ bytes/bits algum formato
(png, jpeg, gif etc.)
14. Por que encoding?
▒ A imagem é uma informação
▒ Bytes / bits são dados
▒ Dados são concretos, informação é
abstrata
▒ Informação = dados + forma de
interpretálos
21. História
▒ Década de 60
▒ Mais de 60 maneiras diferentes de
representar caracteres
▒ Cada fabricante implementava do seu
jeito
▒ Bob Bemer:
▒ “Vamos uniformizar esse negócio...”
26. ASCII
▒ 128 caracteres (nenhum
acentuado)
▒ Intervalo válido
▒ Em decimal: 0 – 127
▒ Em binário: 0000000 – 1111111
▒ Em hexadecimal: 0x00 – 0x7F
27. ASCII
▒ 7 bits?
▒ Muitas máquinas usavam/usam o padrão
de 8 bits para 1 byte
▒ E esse bit sobrando aí?
▒ “Já sei... Vamos usar pra codificar
caracteres locais de cada país!”
43. Exemplo
▒ Você, aqui no Brasil, usando o DOS,
gostaria de dar o seu olá
▒ Você escreve:
▒ Ola!
▒ No Brasil, a gente usava o encoding
chamado “Codepage 850” (ou CP850)
44. Exemplo
▒ Essa sua sequência de 4 caracteres
(“Ola!”) é uma informação
▒ Informação só existe na cabeça dos
seres humanos
▒ Computador não conhece informação.
Computador conhece dados.
45. Exemplo
▒ Para um computador, não existe:
▒ Ola!
▒ O que existe são estes 4 bytes:
▒ 0x4F 0x6C 0x61 0x21
▒ Resultado:
47. Exemplo
▒ Mensagem foi codificada em CP850
▒ Todos os caracteres eram ASCII
também
▒ Na prática:
▒ A mensagem está em ASCII
▒ Todo computador entende ASCII
▒ Então blz!
62. O que é Unicode?
▒ Unicode é:
▒ Um padrão gigantesco
▒ Subdividido em muitas partes
▒ Unicode, ao contrário do ASCII:
▒ Não É uma tabela de caracteres
▒ Não É um encoding
63. O que é Unicode?
▒ Unicode TEM uma tabela de
caracteres:
▒ UCS: Universal Character Set
▒ Unicode TEM diversos encodings
▒ UTF8, UTF16, UTF32 (Unicode
Transformation Format)
64. UCS
▒ Tabela gigante de caracteres
(~100.000)
▒ Cada caractere possui um código,
chamado code point
▒ Code point é representado por U+ e
um número em hexadecimal
72. UTF8
▒ Compatível com ASCII entre
U+0000 e U+007F
▒ A partir de U+0080, usa mais de
1 byte
▒ Para os caracteres da língua
portuguesa, usa 1 ou 2 bytes
73. UCS e UTF
▒ O que eu preciso saber disso
tudo?
▒ Apenas o seguinte:
74. UCS e UTF
▒ Tabela de caracteres ≠ encoding
▒ Diferentes de representação
▒ Mais comum: UTF8
▒ UTF8
▒ Número variável de bytes por
caractere (em geral, 1 ou 2)
75. No mundo real de hoje
▒ Encodings mais usados nos
sistemas que rodam no Brasil:
▒ UTF8
▒ LATIN1
76. No mundo real de hoje
▒ U+0000 – U+007F
▒ Mesmos caracteres da tabela ASCII
▒ U+0000 – U+00FF
▒ Mesmos caracteres da tabela LATIN1
90. LATIN1 e UTF8
▒ O texto foi:
▒ Escrito em UTF8
▒ Enviado a outro sistema
▒ Como o outro sistema vai
adivinhar que o texto está em
UTF8?
91. Unicode
▒ Mas então não é só todo mundo
codificar seus caracteres usando
Unicode e vai dar tudo certo!?
92. Unicode
▒ Calma ...
▒ Em 1º lugar, Unicode não é um
encoding. Não existe “codificar
caracteres usando Unicode”.
▒ Em 2º lugar, não temos controle
sobre todos os sistemas do mundo.
Não podemos fazer com que todos usem
o mesmo encoding (nem deveríamos).
99. Como faz pra dar certo
▒ 2 dicas para evitar problemas de
encoding:
100. Como faz pra dar certo
▒ 1) Use sequências de escape
sempre que possível
▒ Para escrever “Programação”:
▒ Em Java:
▒ "Programau00e7u00e3o"
▒ Em HTML:
▒ <p>Programação</p>
101. Como faz pra dar certo
▒ 2) Faça conversões só quando
realmente for necessário
▒ Ao fazer qualquer conversão, SEMPRE
especifique o encoding
102. Como faz pra dar certo
▒ Vetor de bytes não é string!
▒ String não é vetor de bytes!
▒ O que é válido é:
▒ Decompor string em vetor de bytes +
encoding
▒ Compor string a partir de um vetor de
bytes + um encoding
103. Como faz pra dar certo
▒ Quando é que realmente precisamos
fazer conversões?
▒ Quando fazemos entrada/saída
105. Como faz pra dar certo
▒ Você vai enviar texto em uma
requisição HTTP?
▒ Converta a string para bytes usando
algum encoding
▒ Avise ao servidor que você vai usar
esse encoding
▒ Envie os bytes
106. Como faz pra dar certo
▒ Errado:
▒ Content-Type: text/plain
▒ Certo:
▒ Content-Type: text/plain; charset=utf-8
▒ Content-Type: text/plain; charset=iso-8859-1
107. Como faz pra dar certo
▒ Vai receber um XML?
▒ Receba o conteúdo (bytes)
▒ Repasse diretamente os bytes para a
sua biblioteca de processamento de
XML
108. Como faz pra dar certo
▒ Não preciso me preocupar com
encoding ao processar XML?
▒ Em geral, não!
▒ XML informa seu encoding dentro do
próprio documento
▒ <?xml version="1.0" encoding="utf8"?>
▒ (deveria, pelo menos!)
109. Como faz pra dar certo
▒ “Tem que passar o encoding, tem
que passar o encoding...”
▒ E se eu não passar o encoding?
Não funciona?
110. Como faz pra dar certo
▒ Funciona!
▒ ...às vezes!
▒ O que acontece se eu não
especificar encoding?
▒ Nenhum encoding será usado!
▒ Certo!?
113. Como faz pra dar certo
▒ Se você não especificar
encoding, será usado o encoding
padrão da plataforma
▒ E isso é ERRADO!
▒ É um perigo!
▒ É um absurdo!
114. Como faz pra dar certo
▒ Plataformas MUDAM!
▒ Configurações de ambiente MUDAM!
▒ Encoding padrão MUDA!
115. Java: jeito errado
▒ byte[] meusBytes =
string.getBytes();
(...)
String minhaString =
new String(bytes);
▒ Está dependente de plataforma!
123. Conclusões
▒ Causas são sempre as mesmas:
▒ String sendo lida e/ou escrita usando o
encoding errado
▒ Uso indevido do encoding padrão da
plataforma
▒ Causa raiz de todo o problema:
▒ Ambiguidade: mais de uma maneira de
representar a mesma informação
124. Conclusões
▒ A solução é:
▒ Lembrar: não existe string sem
encoding!
▒ Informar o encoding toda vez que
fizer entrada/saída
125. Referências
▒ The Absolute Minimum Every
Software Developer Absolutely,
Positively Must Know About
Unicode and Character Sets (No
Excuses!)
▒ http://www.joelonsoftware.com/articles/U
126. Referências
▒ Lista de caracteres Unicode e
suas diferentes representações
▒ http://www.fileformat.info/info/unicode/
▒ The Unicode Consortium
▒ http://unicode.org/
128. Adendo
▒ “José” em UTF8 gasta 8 bytes?
▒ http://en.wikipedia.org/wiki/Byte_order_
▒ Encoding padrão da plataforma?
▒ Em geral, é errado usar
▒ Em raras situações, é correto. Ex:
upload de arquivo no cliente.
129. Contatos
▒ Andru00e9 Willik Valenti
▒ awvalenti@gmail.com
▒ @awvFi
▒ Andrei de Oliveira Tognolo
▒ andreitognolo@gmail.com
▒ /andreitognolo