Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

129
Minicurso de Encoding André Willik Valenti (Daitan Group) Andrei Tognolo (Dextra Sistemas) The Developer’s Conference Goiânia 2012

description

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ça!

Transcript of Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Page 1: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Minicurso de Encoding

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

The Developer’s ConferenceGoiânia 2012

Page 2: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Parte 1

O que é e por que existe

Page 4: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 5: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Quem é o encoding?▒ Mais especificamente:

▒ Character encoding

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

Page 6: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Por que encoding?▒ Se dá tanto problema...

▒ Por que a gente usa?

Page 7: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 8: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Por que encoding?▒ Exemplo: imagens

Page 9: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 10: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 11: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 12: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 13: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

PNG

100011000100100100...

(440KB)

00110001011...

(62KB)

JPEG

Page 14: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 15: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Informação=

dados + formade interpretá-los

Page 16: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Encoding▒ “Forma de interpretá-los”

▒ Isso é o encoding!

Page 17: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Encoding▒ Exemplos de encoding:

▒ PNG▒ JPEG▒ MPEG▒ MP3▒ PDF

Page 18: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Character encoding▒ O que é então um character encoding?▒ É só uma determinada maneira de se representar caracteres usando bytes

Page 19: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Encoding▒ Por que a gente usa encoding, então?▒ Porque não tem como não usar!

Page 20: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Parte 2

Como (não) funciona

Por que dá errado

Page 21: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 22: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 23: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII▒ American Standard Code for Information Interchange

▒ 7 bits

▒ 128 diferentes caracteres

Page 24: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII▒ ASCII é, ao mesmo tempo:

▒ Um encoding▒ Uma tabela de caracteres

Page 25: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII▒ Exemplos:

Caractere Decimal Hexa Binário

5 53 0x35 0110101

A 65 0x41 1000001

} 125 0x7D 1111101

Page 26: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII▒ 128 caracteres (nenhum acentuado)

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

Page 27: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 28: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII estendido▒ 8 bits: 256 caracteres

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

Page 29: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII estendido▒ 0x00 – 0x7F: igual ASCII

▒ a b C D 3 5 9 % & /

▒ 0x80 – 0xFF: caracteres locais▒ ç Á ã é ü ¿

Page 30: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

0x80 0x81 0x82 ... 0xFF

ASCII original

ASCII estendido

0x00 0x01 0x02 ... 0x7F

Page 31: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII estendido▒ Problema:

▒ Não existe “o encoding ASCII estendido”

▒ Existem UM MONTE de encodings que são “ASCII estendido”

Page 32: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCIIs estendidos▒ Codepages

▒ 437 — The original IBM PC code page▒ 720 — Arabic▒ 737 — Greek▒ 775 — Estonian, Lithuanian and Latvian▒ 850 — "Multilingual (Latin-1)"▒ 852 — "Slavic (Latin-2)"▒ 855 — Cyrillic▒ 857 — Turkish▒ 858 — "Multilingual" with euro symbol▒ 860 — Portuguese▒ 863 — French (Quebec French) ▒ 865 — Danish/Norwegian▒ 866 — Cyrillic ▒ 869 — Greek ▒ 874 — Thai▒ ...

Page 33: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCIIs estendidos▒ ISO-8859-1

▒ Também conhecido como LATIN-1

▒ É um ASCII estendido:▒ 256 caracteres▒ Compatível com ASCII

▒ Usado até hoje

Page 34: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCIIs estendidos▒ Maravilha!

▒ Milhares de encodings diferentes

▒ Agora todo mundo vai conseguir representar seus caracteres!

Page 35: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCIIs estendidos▒ E a interoperabilidade?

▒ Internet, internacionalização?▒ Troca de textos, documentos?▒ Nomes de arquivos?

Page 36: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Júnior.txt

Page 37: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 38: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Olá, meu nome é José Luàs de

Assunção Júnior, sou irmão da SÃ

lvia, da Cláudia e do João.

Page 39: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 40: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII▒ No fim das contas, ficou assim:

Page 41: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII▒ Na teoria:

▒ ASCII original: 0x00 – 0x7F

▒ Extensão do ASCII: 0x80 – 0xFF

Page 42: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

ASCII▒ Na prática:

▒ ASCII original: Blz!

▒ Extensão do ASCII: Esquece!

Page 43: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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)

Page 44: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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.

Page 45: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Exemplo▒ Para um computador, não existe:

▒ Ola!

▒ O que existe são estes 4 bytes:▒ 0x4F 0x6C 0x61 0x21

▒ Resultado:

Page 46: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Exemplo▒ Blz !

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

Page 47: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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!

Page 48: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Exemplo▒ E se a gente escrever...

▒ Olá!

▒ Resultado:

Page 49: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Exemplo▒ Blz !

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

▒ (Usando codepage 850)

Page 50: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 51: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Exemplo▒ Não blz

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

Page 52: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Exemplo▒ Encoding russo disse:

▒ 0xE1 é um р

▒ Encoding brasileiro tinha dito:▒ 0xE1 é um á

▒ Quem está certo?

Page 53: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 54: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

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

Page 55: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Encodings▒ E se tivesse um jeito...

▒ ...de informar ao computador russo que a gente usou o CP850?

▒ Segure essa ideia!

Page 56: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Encodings▒ O mundo inteiro...

▒ ...cada um com o seu encoding?

▒ É óbvio que não daria certo▒ Teria que uniformizar de verdade!

Page 57: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Encodings▒ E se houvesse...

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

Page 58: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

UNICODE!!

Page 59: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Unicode▒ O que é Unicode?

Page 60: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 61: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

The Unicode 5.0 Standard

▒ 1472 páginas▒ É grande

Page 62: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 63: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

O que é Unicode?▒ Unicode TEM uma tabela de caracteres:▒ UCS: Universal Character Set

▒ Unicode TEM diversos encodings▒ UTF-8, UTF-16, UTF-32 (Unicode Transformation Format)

Page 64: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 65: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

UCS▒ Exemplos:

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

Page 66: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

UCS▒ Intervalo U+0000 – U+007F

▒ Mesmos caracteres da tabela ASCII

Page 67: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

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

Page 68: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Encodings Unicode▒ Maneiras de transformar caracteres abstratos em concretos

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

Page 69: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 70: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

UTF-16▒ Exemplos:

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

Page 71: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

UTF-8▒ Exemplos:

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

Page 72: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 73: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

▒ Apenas o seguinte:

Page 74: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

UCS e UTF▒ Tabela de caracteres ≠ encoding

▒ Diferentes de representação▒ Mais comum: UTF-8

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

Page 75: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 76: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

No mundo real de hoje▒ U+0000 – U+007F

▒ Mesmos caracteres da tabela ASCII

▒ U+0000 – U+00FF▒ Mesmos caracteres da tabela LATIN-1

Page 77: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1▒ Serve para representar qualquer caractere Unicode?

Page 78: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1▒ Não!

▒ Usa exatamente 1 byte por caractere▒ 1 byte não seria suficiente

Page 79: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1 e UTF-8▒ Blz!

▒ Então vamos representar a string “José”

▒ String: é uma informação ou um dado?

Page 81: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1 e UTF-8▒ Lembra o Barakis Obamis com o PNG e o JPEG?

Page 82: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

PNG

100011000100100100...

(440KB)

00110001011...

(62KB)

JPEG

Page 83: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1 e UTF-8▒ O José com o LATIN-1 e UTF-8 é a mesma coisa!

Page 84: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1

0x4A 0x6F 0x73 0xE9

(4 bytes)

UTF-8

José

0x4A 0x6F 0x73 0xC3 0xA9

(5 bytes)

Page 85: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1 e UTF-8▒ Blz. Mas por que eu escrevo “José” num lugar e depois aparece “José” no outro?

Page 86: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

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

Page 87: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1 e UTF-8▒ Aí você envia esses bytes

0x4A 0x6F 0x73 0xC3 0xA9

para alguém

Page 88: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

▒ 0x4A 0x6F 0x73 0xC3 0xA9

↓ ↓ ↓ ↓ J o s é

Page 89: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

▒ 0x4A 0x6F 0x73 0xC3 0xA9

↓ ↓ ↓ ↓ ↓ J o s à ©

Page 90: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

LATIN-1 e UTF-8▒ O texto foi:

▒ Escrito em UTF-8▒ Enviado a outro sistema

▒ Como o outro sistema vai adivinhar que o texto está em UTF-8?

Page 91: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Unicode▒ Mas então não é só todo mundo codificar seus caracteres usando Unicode e vai dar tudo certo!?

Page 92: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 93: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Parte 3

Como faz pra dar certo

Page 94: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Informação=

dados + formade interpretá-los

Page 95: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Informação String

= =

Dados Bytes

+ +

Forma de interpretá-los

Encoding

Page 96: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

String..

=..bytes + encoding

Page 97: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Não existe string sem encoding!

Page 98: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 99: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 100: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 101: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 102: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 103: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Como faz pra dar certo▒ Quando é que realmente precisamos fazer conversões?▒ Quando fazemos entrada/saída

Page 104: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Como faz pra dar certo▒ Exemplos:

Page 105: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 106: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 107: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 108: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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="utf-8"?>▒ (deveria, pelo menos!)

Page 109: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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?

Page 110: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Como faz pra dar certo▒ Funciona!

▒ ...às vezes!

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

Page 111: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

!!!!!!!!!!!

!!ERRADO!!

!!!!!!!!!!!

Page 112: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)
Page 113: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 114: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 115: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Java: jeito errado▒ byte[] meusBytes =

string.getBytes();

(...)

String minhaString =new String(bytes);

▒ Está dependente de plataforma!

Page 116: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Java: jeito certo▒ byte[] meusBytes =

string.getBytes("UTF-8");

(...)

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

▒ Agora, sim, independe de plataforma!

Page 117: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Java: jeito certo▒ Não precisa ser UTF-8, pode ser qualquer outro

Page 118: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Java: jeito certo▒ byte[] meusBytes =

string.getBytes("LATIN1");

(...)

String minhaString =new String(bytes,

"LATIN1");

Page 119: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Java: jeito certo▒ byte[] meusBytes =

string.getBytes("UTF-16");

(...)

String minhaString =new String(bytes, "UTF-

16");

Page 120: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Java: jeito certo▒ byte[] meusBytes =

string.getBytes("UTF-32");

(...)

String minhaString =new String(bytes, "UTF-

32");

Page 121: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Demonstração...

Page 122: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

Page 123: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 124: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Conclusões▒ A solução é:

▒ Lembrar: não existe string sem encoding!

▒ Informar o encoding toda vez que fizer entrada/saída

Page 125: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Referências▒ 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 126: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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

▒ The Unicode Consortium▒ http://unicode.org/

Page 127: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

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 128: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Adendo▒ “José” em UTF-8 gasta 8 bytes?

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

▒ Encoding padrão da plataforma?▒ Em geral, é errado usar▒ Em raras situações, é correto. Ex: upload de arquivo no cliente.

Page 129: Minicurso de Encoding - resolvendo problemas com acentuação (#TDC2012 Goiânia)

Contatos▒ Andr\u00e9 Willik Valenti

[email protected]▒ @awvFi

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