O documento discute encodings e como eles funcionam. Em 3 frases:
(1) Encodings mapeiam caracteres abstratos para sequências concretas de bytes para armazenamento em computadores; (2) Historicamente houveram muitos encodings diferentes causando problemas de interoperabilidade; (3) O Unicode criou uma tabela única de caracteres e encodings como UTF-8 para representá-los de forma consistente entre sistemas.
6. Por que encoding?
▒ Por que se usa encoding?
▒ Onde NÃO se usa encoding?
▒ Segure essa ideia!
▒ Computador é uma máquina de
armazenar e processar informação
▒ Mas o que É informação?
▒ Segure essa ideia!
14. Um grande número binário?
11111111110110001111111111100000
00000000000100000100101001000110
10010010100011000000000000000010
0000001000000010000000001011111
...
15. Por que encoding?
▒ A resposta correta é:
▒ Todas são diferentes formas de
enxergar a mesma coisa
16. Por que encoding?
▒ A imagem é uma informação
▒ Pixels, bytes e bits são dados
▒ Dados são concretos. Informação é
abstrata.
▒ Informação = dados + forma de
interpretálos
18. Resumindo
▒ Informação
▒ O conceito abstrato a ser representado
▒ Exemplo: imagem
▒ Dados
▒ Representação concreta de informação
▒ Exemplo: sequência de bytes
▒ Encoding
▒ Forma de codificar informação em dados
▒ Exemplo: JPEG
19. Encoding
▒ Voltando à pergunta: onde NÃO
usa encoding?
▒ Em lugar nenhum. Tudo usa encoding!
20. Encoding
▒ PNG é um encoding
▒ JPEG é um encoding
▒ MPEG é um encoding
▒ MP3 é um encoding
▒ PDF é um encoding
▒ ...
▒ Alguém já usou algum CODEC?
21. Character encoding
▒ Um character encoding é uma
determinada maneira de se
representar caracteres
23. História
▒ Década de 60
▒ Mais de 60 maneiras diferentes de
representar caracteres
▒ Cada fabricante implementava do seu
jeito
24. História
▒ Bob Bemer:
▒ “Vamos uniformizar esse negócio...”
▒ Formouse um comitê do ANSI
(American National Standards
Institute) para essa tarefa
▒ 2 anos de trabalho depois...
30. ASCII
▒ Em vez de usar apenas 7 bits,
muitas máquinas usavam/usam 8
▒ E esse bit sobrando aí?
▒ Já sei!!!
▒ Vamos usar pra codificar caracteres
locais de cada país!
31. ASCII
▒ Com 8 bits, conseguimos
representar 256 diferentes
caracteres
▒ Intervalo válido:
▒ 0 – 255 (em decimal)
▒ 0x00 – 0xFF (em hexadecimal)
32. Extensões para ASCII
▒ Codepages
▒ 437 — The original IBM PC code page
▒ 720 — Arabic
▒ 737 — Greek
▒ 775 — Estonian, Lithuanian and
Latvian
▒ 850 — "Multilingual (Latin1)"
(Western European languages)
33. Extensões para ASCII
▒ Codepages
▒ 852 — "Slavic (Latin2)" (Central
and Eastern European languages)
▒ 855 — Cyrillic
▒ 857 — Turkish
▒ 858 — "Multilingual" with euro
symbol
▒ 860 — Portuguese
35. ASCII
▒ Maravilha! Com dezenas de encodings
diferentes, todos poderão representar
seus caracteres!
▒ Mas e a interoperabilidade?
▒ Oras, quem é que vai precisar ler ou
escrever usando caracteres dos outros
países??
▒ O resultado todos já conhecem:
36.
37.
38. ASCII
▒ No fim das contas, ficou assim:
▒ 0x00 – 0x7F: ASCII normal
▒ 0x80 – 0xFF: ASCII estendido
42. Exemplo
▒ Você, aqui no Brasil, gostaria
de dar o seu olá
▒ Se você escrever:
▒ Ola!
43. Exemplo
▒ Essa sua sequência de 4 caracteres é
uma informação
▒ Informação só existe na cabeça dos
seres humanos
▒ Computador não conhece informação.
Computador conhece dados.
44. Exemplo
▒ Para um computador, não existe:
▒ Ola!
▒ O que existe são estes 4 bytes
(ASCII):
▒ 0x4F 0x6C 0x61 0x21 (hexa)
▒ 79 108 97 33 (decimal)
50. Exemplo
▒ Não blz
▒ Pois:
▒ O l р !
▒ ↑ ↑ ↑ ↑
▒ 0x4F 0x6C 0xE1 0x21
51. Exemplo
▒ Quem foi que falou que 0xE1
corresponde ao caractere á???
▒ Codepage 850 falou!
▒ Mas codepage 855 falou que 0xE1
equivale a р!
▒ Quem está certo???
55. Exemplo
▒ Não blz
▒ Pois:
▒ O l á !
▒ ↑ ↑ ↑ ↑
▒ 0x4F 0x6C ???? 0x21
56. Encodings
▒ Não existe uma forma única de
representar o caractere á
▒ A sequência de bytes é ambígua:
▒ 0x4F 0x6C 0xE1 0x21
57. Encodings
▒ Mas e se...
▒ ...a gente enviar para o computador
russo o seguinte:
▒ A sequência de bytes
+
▒ O encoding usado (codepage 850)
▒ Será que dá certo?
▒ Segure essa ideia!
58. ISO88591
▒ Também conhecido como LATIN1
▒ Mesma ideia dos ASCII
estendidos:
▒ 255 caracteres
▒ Compatível com ASCII
59. Encodings
▒ É óbvio que não iria dar certo o
mundo inteiro tentando se
comunicar cada um usando seu
encoding específico
▒ Seria necessário uniformizar de
verdade
65. O que é Unicode?
▒ Duas partes interessantes para
nós nesse momento:
▒ UCS
▒ Universal Character Set
▒ Encodings
▒ UTF8, UTF16, UTF32 (Unicode
Transformation Format)
66. UCS
▒ Tabela gigante de caracteres
▒ Cada caractere possui um código,
chamado code point
▒ Code point é representado por U+ e
um número em hexadecimal
73. UTF8
▒ Compatível com ASCII entre
U+0000 e U+007F
▒ A partir de U+0080, usa mais de
um byte
▒ Para os caracteres da língua
portuguesa, usa 1 ou 2 bytes
74. UCS e UTF
▒ O que eu preciso saber disso
tudo?
▒ Apenas o seguinte:
75. UCS e UTF
▒ Tabela de caracteres ≠ encoding
▒ Existem formas diferentes de se
representar caracteres Unicode. A
mais comum é usando UTF8.
▒ UTF8 usa número variável de bytes
por caractere (em geral, 1 ou 2)
76. No mundo real de hoje
▒ Encodings mais usados nos
sistemas que rodam no Brasil:
▒ UTF8
▒ LATIN1
78. LATIN1
▒ NÃO é um encoding para Unicode
▒ Usa exatamente 1 byte por caractere
▒ 1 byte não seria suficiente
▒ Mesma ideia dos ASCIIs
estendidos:
▒ 0x00 a 0x7F: igual ASCII
▒ 0x80 a 0xFF: outros caracteres
79. LATIN1 e UTF8
▒ Exemplos
Bytes usando Bytes usando
Caractere
UTF-8 LATIN-1
X 0x58 0x58
à 0xC3 0xA3 0xE3
☃ 0xE2 0x98 0x83 Não existe
80. LATIN1 e UTF8
▒ Agora que já vimos LATIN1 e
UTF8, voltemos à seguinte
questão:
94. Como faz pra dar certo
▒ 2 dicas para evitar problemas de
encoding:
95. 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>
96. 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
▒ Quando é que realmente precisamos
fazer conversões?
▒ Quando fazemos entrada/saída
98. 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
99. Como faz pra dar certo
▒ Certo:
▒ Content-Type: text/plain; charset=utf-8
▒ Content-Type: text/plain;
charset=iso-8859-1
▒ Errado:
▒ Content-Type: text/plain (não existe texto
sem encoding!)
100. Como faz pra dar certo
▒ Vai receber um XML?
▒ Receba o conteúdo (bytes)
▒ Repasse os bytes para a sua
biblioteca de processamento de XML
▒ XML informa seu encoding dentro do
próprio documento
101. Como faz pra dar certo
▒ “Tem que passar o encoding, tem
que passar encoding...”
▒ E se eu não passar o encoding?
Não funciona?
102. Como faz pra dar certo
▒ Funciona!
▒ ...às vezes!
▒ O que acontece se eu não
especificar encoding?
▒ Nenhum encoding será usado!
▒ Certo!?
105. 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!
106. Como faz pra dar certo
▒ Plataformas MUDAM!
▒ Configurações de ambiente MUDAM!
▒ Encoding padrão MUDA!
111. Conclusões
▒ Qualquer peça do quebracabeça
pode estragar tudo
▒ Programação defensiva costuma
ser a melhor (e talvez a única)
solução
112. 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
114. Referências
▒ The Unicode Consortium
▒ http://unicode.org/
▒ The Absolute Minimum Every Software
Developer Absolutely, Positively Must
Know About Unicode and Character Sets
(No Excuses!)
▒ http://www.joelonsoftware.com/articles/Unicode.
115. Referências
▒ Lista de caracteres Unicode e
suas diferentes representações
▒ http://www.fileformat.info/info/unicode/