Minicurso Encoding - TDC2012

117
Minicurso de Encoding André Willik Valenti (Daitan) Andrei Tognolo (Dextra) The Developer’s Conference 2012

description

Versão nova do Minicurso de Encoding, apresentada no TDC2012 em São Paulo. Versão antiga: http://www.slideshare.net/AndrFi/minicurso-encoding================================Você já perdeu a cabeça e a paciência tentando entender de onde vêm aqueles caracteres malignos que misteriosamente tomam o lugar das palavras acentuadas?Você não se conforma que o ser humano já foi pra lua mas ainda não conseguiu garantir que um mísero texto chegue corretamente ao seu destino?Você não entende o que diabo é Unicode, LATIN-1, UTF-8, UTF-16, UTF-32 e como essas coisas influenciam a sua vida?Seus problemas acabaram!! - ou não... Na verdade, eles vão continuar. Mas pelo menos você vai aprender a lidar melhor com eles!Neste minicurso, serão explicados os conceitos básicos do mundo mágico do encoding e da representação dos diferentes caracteres ao redor do mundo. Veremos por que motivos as coisas podem ficar feias e o que podemos fazer para elas ficarem bonitas. Veremos maneiras de programar defensivamente para evitar, dentro do possível, o infeliz problema.Compareçam!

Transcript of Minicurso Encoding - TDC2012

Page 1: Minicurso Encoding - TDC2012

Minicurso de Encoding

André Willik Valenti (Daitan)Andrei Tognolo (Dextra)

The Developer’s Conference 2012

Page 2: Minicurso Encoding - TDC2012

Roteiro▒ Parte 1

▒ O que é e por que existe

▒ Parte 2▒ Como funciona▒ Por que dá errado

▒ Parte 3▒ Como faz pra dar certo

Page 3: Minicurso Encoding - TDC2012

Parte 1

O que é e por que existe

Page 4: Minicurso Encoding - TDC2012

Encoding? Hein!?▒ Mais especificamente:

▒ Character encoding

▒ Também conhecido como:▒ Codificação de caracteres▒ Charset

Page 5: Minicurso Encoding - TDC2012

Quem é o encoding?▒ O encoding é o culpado por:

▒ Programação Programação Programa褯

▒ José Luís Assunção Júnior José Luà s Assunção Júnior Jos題 uAssun 褯 Jr

Page 6: Minicurso Encoding - TDC2012

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!

Page 7: Minicurso Encoding - TDC2012

Por que encoding?▒ Veja esta imagem

Page 8: Minicurso Encoding - TDC2012
Page 9: Minicurso Encoding - TDC2012

Por que encoding?▒ Esta imagem é uma informação

▒ Como a gente representa essa informação no computador?

Page 10: Minicurso Encoding - TDC2012

Por que encoding?▒ Formato da imagem é JPEG

▒ Mas o que é uma imagem JPEG?

▒ Podemos olhar para “uma imagem JPEG” sob quais pontos de vista?

Page 11: Minicurso Encoding - TDC2012

Uma imagem mesmo?

Page 12: Minicurso Encoding - TDC2012

Um monte de pixels?

Page 13: Minicurso Encoding - TDC2012

Um monte de bytes?

Page 14: Minicurso Encoding - TDC2012

Um grande número binário?

1111111111011000111111111110000000000000000100000100101001000110100100101000110000000000000000100000001000000010000000001011111

...

Page 15: Minicurso Encoding - TDC2012

Por que encoding?▒ A resposta correta é:

▒ Todas são diferentes formas de enxergar a mesma coisa

Page 16: Minicurso Encoding - TDC2012

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

Page 17: Minicurso Encoding - TDC2012

Informação=

dados + formade interpretá-los

Page 18: Minicurso Encoding - TDC2012

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

Page 19: Minicurso Encoding - TDC2012

Encoding▒ Voltando à pergunta: onde NÃO usa encoding?▒ Em lugar nenhum. Tudo usa encoding!

Page 20: Minicurso Encoding - TDC2012

Encoding▒ PNG é um encoding▒ JPEG é um encoding▒ MPEG é um encoding▒ MP3 é um encoding▒ PDF é um encoding▒ ...

▒ Alguém já usou algum CODEC?

Page 21: Minicurso Encoding - TDC2012

Character encoding▒ Um character encoding é uma determinada maneira de se representar caracteres

Page 22: Minicurso Encoding - TDC2012

Parte 2

Como (não) funciona

Por que dá errado

Page 23: Minicurso Encoding - TDC2012

História▒ Década de 60

▒ Mais de 60 maneiras diferentes de representar caracteres

▒ Cada fabricante implementava do seu jeito

Page 24: Minicurso Encoding - TDC2012

História▒ Bob Bemer:

▒ “Vamos uniformizar esse negócio...”

▒ Formou-se um comitê do ANSI (American National Standards Institute) para essa tarefa

▒ 2 anos de trabalho depois...

Page 25: Minicurso Encoding - TDC2012
Page 26: Minicurso Encoding - TDC2012

ASCII▒ American Standard Code for Information Interchange

▒ 7 bits

▒ 128 diferentes caracteres

Page 27: Minicurso Encoding - TDC2012

ASCII▒ Exemplos:

ASCII Decimal Hexa Binário

5 53 0x35 0110101

A 65 0x41 1000001

} 125 0x7D 1111101

Page 28: Minicurso Encoding - TDC2012

ASCII▒ Intervalo válido

▒ Em decimal: 0 – 127▒ Em binário: 0000000 – 1111111▒ Em hexadecimal: 0x00 – 0x7F

Page 29: Minicurso Encoding - TDC2012

ASCII▒ Somente 128 caracteres...

▒ Nenhum caractere acentuado

Page 30: Minicurso Encoding - TDC2012

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!

Page 31: Minicurso Encoding - TDC2012

ASCII▒ Com 8 bits, conseguimos representar 256 diferentes caracteres

▒ Intervalo válido:▒ 0 – 255 (em decimal)▒ 0x00 – 0xFF (em hexadecimal)

Page 32: Minicurso Encoding - TDC2012

Extensões para ASCII▒ Codepages

▒ 437 — The original IBM PC code page▒ 720 — Arabic▒ 737 — Greek▒ 775 — Estonian, Lithuanian and Latvian

▒ 850 — "Multilingual (Latin-1)" (Western European languages)

Page 33: Minicurso Encoding - TDC2012

Extensões para ASCII▒ Codepages

▒ 852 — "Slavic (Latin-2)" (Central and Eastern European languages)

▒ 855 — Cyrillic▒ 857 — Turkish▒ 858 — "Multilingual" with euro symbol

▒ 860 — Portuguese

Page 34: Minicurso Encoding - TDC2012

Extensões para ASCII▒ Codepages

▒ 863 — French (Quebec French) ▒ 865 — Danish/Norwegian▒ 866 — Cyrillic ▒ 869 — Greek ▒ 874 — Thai

Page 35: Minicurso Encoding - TDC2012

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:

Page 36: Minicurso Encoding - TDC2012
Page 37: Minicurso Encoding - TDC2012
Page 38: Minicurso Encoding - TDC2012

ASCII▒ No fim das contas, ficou assim:

▒ 0x00 – 0x7F: ASCII normal▒ 0x80 – 0xFF: ASCII estendido

Page 39: Minicurso Encoding - TDC2012

ASCII▒ Na prática:

▒ 0x00 – 0x7F: blz! ▒ 0x80 – 0xFF: não blz

Page 40: Minicurso Encoding - TDC2012

ASCII▒ E por que de 0x80 a 0xFF é “não blz”?

▒ Já vamos ver por quê...

Page 41: Minicurso Encoding - TDC2012

Encodings▒ No Brasil, o codepage 850 era muito usado

Page 42: Minicurso Encoding - TDC2012

Exemplo▒ Você, aqui no Brasil, gostaria de dar o seu olá

▒ Se você escrever:▒ Ola!

Page 43: Minicurso Encoding - TDC2012

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.

Page 44: Minicurso Encoding - TDC2012

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)

Page 45: Minicurso Encoding - TDC2012

Exemplo▒ Blz !

▒ O l a !▒ ↑ ↑ ↑ ↑▒ 0x4F 0x6C 0x61 0x21

Page 46: Minicurso Encoding - TDC2012

Exemplo▒ Qualquer computador que entenda ASCII (e todos entendem) vai conseguir processar corretamente a sua informação

Page 47: Minicurso Encoding - TDC2012

Exemplo▒ E se a gente escrever...

▒ Olá!

Page 48: Minicurso Encoding - TDC2012

Exemplo▒ Blz !▒ Pois:

▒ O l á !▒ ↑ ↑ ↑ ↑▒ 0x4F 0x6C 0xE1 0x21

Page 49: Minicurso Encoding - TDC2012

Exemplo▒ Até você tentar ler isso num computador russo e...

Page 50: Minicurso Encoding - TDC2012

Exemplo▒ Não blz ▒ Pois:

▒ O l р !▒ ↑ ↑ ↑ ↑▒ 0x4F 0x6C 0xE1 0x21

Page 51: Minicurso Encoding - TDC2012

Exemplo▒ Quem foi que falou que 0xE1 corresponde ao caractere á???▒ Codepage 850 falou!

▒ Mas codepage 855 falou que 0xE1 equivale a р!

▒ Quem está certo???

Page 52: Minicurso Encoding - TDC2012
Page 53: Minicurso Encoding - TDC2012
Page 54: Minicurso Encoding - TDC2012

Exemplo▒ Ou seja:

Page 55: Minicurso Encoding - TDC2012

Exemplo▒ Não blz ▒ Pois:

▒ O l á !▒ ↑ ↑ ↑ ↑▒ 0x4F 0x6C ???? 0x21

Page 56: Minicurso Encoding - TDC2012

Encodings▒ Não existe uma forma única de representar o caractere á

▒ A sequência de bytes é ambígua:▒ 0x4F 0x6C 0xE1 0x21

Page 57: Minicurso Encoding - TDC2012

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!

Page 58: Minicurso Encoding - TDC2012

ISO-8859-1▒ Também conhecido como LATIN-1▒ Mesma ideia dos ASCII estendidos:▒ 255 caracteres▒ Compatível com ASCII

Page 59: Minicurso Encoding - TDC2012

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

Page 60: Minicurso Encoding - TDC2012

Encodings▒ Seria necessário...

▒ Um código...▒ Um código único...▒ Um único código...▒ Um...

Page 61: Minicurso Encoding - TDC2012

UNICODE!!

Page 62: Minicurso Encoding - TDC2012

Unicode▒ O que é Unicode?

Page 63: Minicurso Encoding - TDC2012
Page 64: Minicurso Encoding - TDC2012

The Unicode 5.0 Standard

▒ 1472 páginas▒ É grande

Page 65: Minicurso Encoding - TDC2012

O que é Unicode?▒ Duas partes interessantes para nós nesse momento:▒ UCS

▒Universal Character Set

▒ Encodings▒UTF-8, UTF-16, UTF-32 (Unicode Transformation Format)

Page 66: Minicurso Encoding - TDC2012

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

Page 67: Minicurso Encoding - TDC2012

UCS▒ Exemplos:

▒ U+0058: X▒ U+00E3: ã▒ U+2603: ☃▒ U+10123:

Page 68: Minicurso Encoding - TDC2012

UCS▒ Caracteres na tabela são abstratos (são informação)

▒ Para concretizá-los, é necessário um encoding

Page 69: Minicurso Encoding - TDC2012

Encodings Unicode▒ Maneiras de transformar caracteres abstratos em concretos

▒ Três principais: UTF-8, UTF-16, UTF-32

Page 70: Minicurso Encoding - TDC2012

UTF-32▒ Exemplos:

▒ U+0058: 0x00 0x00 0x00 0x58▒ U+00E3: 0x00 0x00 0x00 0xE3▒ U+2603: 0x00 0x00 0x26 0x03▒ U+10123: 0x00 0x01 0x01 0x23

Page 71: Minicurso Encoding - TDC2012

UTF-16▒ Exemplos:

▒ U+0058: 0x00 0x58▒ U+00E3: 0x00 0xE3▒ U+2603: 0x26 0x03▒ U+10123: 0xD8 0x00 0xDD 0x23

Page 72: Minicurso Encoding - TDC2012

UTF-8▒ Exemplos:

▒ U+0058: 0x58▒ U+00E3: 0xC3 0xA3▒ U+2603: 0xE2 0x98 0x83▒ U+10123: 0xF0 0x90 0x84 0xA3

Page 73: Minicurso Encoding - TDC2012

UTF-8▒ 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

Page 74: Minicurso Encoding - TDC2012

UCS e UTF▒ O que eu preciso saber disso tudo?

▒ Apenas o seguinte:

Page 75: Minicurso Encoding - TDC2012

UCS e UTF▒ Tabela de caracteres ≠ encoding

▒ Existem formas diferentes de se representar caracteres Unicode. A mais comum é usando UTF-8.

▒ UTF-8 usa número variável de bytes por caractere (em geral, 1 ou 2)

Page 76: Minicurso Encoding - TDC2012

No mundo real de hoje▒ Encodings mais usados nos sistemas que rodam no Brasil:▒ UTF-8▒ LATIN-1

Page 77: Minicurso Encoding - TDC2012

LATIN-1▒ Serve para caracteres Unicode?

Page 78: Minicurso Encoding - TDC2012

LATIN-1▒ 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

Page 79: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ Exemplos

CaractereBytes usando

UTF-8Bytes usando

LATIN-1

X 0x58 0x58

à 0xC3 0xA3 0xE3

☃ 0xE2 0x98 0x83 Não existe

Page 80: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ Agora que já vimos LATIN-1 e UTF-8, voltemos à seguinte questão:

Page 81: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ Por que “José” vira “José”???

Page 82: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ “José” em UTF-8:

▒ J o s é▒ ↑ ↑ ↑ ↑▒ 0x4A 0x6F 0x73 0xC3 0xA9

▒ Bytes 0x4A 0x6F 0x73 0xC3 0xA9 representam “José” em UTF-8

Page 83: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ E se você enviar esses bytes

0x4A 0x6F 0x73 0xC3 0xA9

para alguém?

Page 84: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ Se a pessoa ler em UTF-8, blz!

▒ 0x4A 0x6F 0x73 0xC3 0xA9

▒ ↓ ↓ ↓ ↓ ▒ J o s é

Page 85: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ Mas e se ela ler em LATIN-1?

▒ 0x4A 0x6F 0x73 0xC3 0xA9

▒ ↓ ↓ ↓ ↓ ↓ ▒ J o s à ©

Page 86: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ Se você não avisar que o seu texto está em UTF-8, como a pessoa vai adivinhar?

Page 87: Minicurso Encoding - TDC2012

LATIN-1 e UTF-8▒ Toda vez que você envia uma sequência de bytes e não envia o encoding junto, corre o risco de ser mal-interpretado

Page 88: Minicurso Encoding - TDC2012

Parte 3

Como faz pra dar certo

Page 89: Minicurso Encoding - TDC2012

Informação=

dados + formade interpretá-los

Page 90: Minicurso Encoding - TDC2012

Informação String

= =

Dados Bytes

+ +

Forma de interpretá-los

Encoding

Page 91: Minicurso Encoding - TDC2012

String..

=..bytes + encoding

Page 92: Minicurso Encoding - TDC2012

Não existe string sem encoding!

Page 93: Minicurso Encoding - TDC2012

Não existe relação byte caractere sem encoding!

Page 94: Minicurso Encoding - TDC2012

Como faz pra dar certo▒ 2 dicas para evitar problemas de encoding:

Page 95: Minicurso Encoding - TDC2012

Como faz pra dar certo▒ 1) Use sequências de escape sempre que possível

▒ Para escrever “Programação”:▒ Em Java:

▒"Programa\u00e7\u00e3o"▒ Em HTML:

▒<p>Programa&ccedil;&atilde;o</p>

Page 96: Minicurso Encoding - TDC2012

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

Page 97: Minicurso Encoding - TDC2012

Como faz pra dar certo▒ Exemplos:

Page 98: Minicurso Encoding - TDC2012

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

Page 99: Minicurso Encoding - TDC2012

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!)

Page 100: Minicurso Encoding - TDC2012

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

Page 101: Minicurso Encoding - TDC2012

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?

Page 102: Minicurso Encoding - TDC2012

Como faz pra dar certo▒ Funciona!

▒ ...às vezes!

▒ O que acontece se eu não especificar encoding?▒ Nenhum encoding será usado!▒ Certo!?

Page 103: Minicurso Encoding - TDC2012

!!!!!!!!!!!

!!ERRADO!!

!!!!!!!!!!!

Page 104: Minicurso Encoding - TDC2012
Page 105: Minicurso Encoding - TDC2012

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!

Page 106: Minicurso Encoding - TDC2012

Como faz pra dar certo▒ Plataformas MUDAM!▒ Configurações de ambiente MUDAM!▒ Encoding padrão MUDA!

Page 107: Minicurso Encoding - TDC2012

Java: jeito errado▒ byte[] meusBytes =

string.getBytes();

▒ String minhaString =new String(bytes);

Page 108: Minicurso Encoding - TDC2012

Java: jeito certo▒ byte[] meusBytes =

string.getBytes("UTF-8");

▒ String minhaString =new String(bytes, "UTF-8");

Page 109: Minicurso Encoding - TDC2012

Demonstração...

Page 110: Minicurso Encoding - TDC2012

Conclusões▒ Problemas de encoding acontecem nas melhores famílias

Page 111: Minicurso Encoding - TDC2012

Conclusões▒ Qualquer peça do quebra-cabeça pode estragar tudo

▒ Programação defensiva costuma ser a melhor (e talvez a única) solução

Page 112: Minicurso Encoding - TDC2012

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

Page 113: Minicurso Encoding - TDC2012

Conclusões▒ Apenas reforçando:

▒ Não existe informação sem forma de interpretação

▒ Não existe string sem encoding

Page 114: Minicurso Encoding - TDC2012

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

Page 115: Minicurso Encoding - TDC2012

Referências▒ Lista de caracteres Unicode e suas diferentes representações▒ http://www.fileformat.info/info/unicode/

Page 116: Minicurso Encoding - TDC2012

Referências▒ ASCII

▒ http://en.wikipedia.org/wiki/ASCII

▒ Unicode▒ http://en.wikipedia.org/wiki/Unicode

▒ UTF-8▒ http://en.wikipedia.org/wiki/UTF-8

Page 117: Minicurso Encoding - TDC2012

Contatos▒ André Willik Valenti

[email protected]▒ @awvFi

▒ Andrei de Oliveira Tognolo▒ [email protected]▒ /andreitognolo