minicurso encoding - tdc2012
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
![Page 1: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/1.jpg)
Minicurso de Encoding
André Willik Valenti (Daitan)Andrei Tognolo (Dextra)
The Developer’s Conference 2012
![Page 2: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/3.jpg)
Parte 1
O que é e por que existe
![Page 4: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/4.jpg)
Encoding? Hein!?▒ Mais especificamente:
▒ Character encoding
▒ Também conhecido como:▒ Codificação de caracteres▒ Charset
![Page 5: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/7.jpg)
Por que encoding?▒ Veja esta imagem
![Page 8: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/8.jpg)
![Page 9: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/9.jpg)
Por que encoding?▒ Esta imagem é uma informação
▒ Como a gente representa essa informação no computador?
![Page 10: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/11.jpg)
Uma imagem mesmo?
![Page 12: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/12.jpg)
Um monte de pixels?
![Page 13: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/13.jpg)
Um monte de bytes?
![Page 14: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/14.jpg)
Um grande número binário?
1111111111011000111111111110000000000000000100000100101001000110100100101000110000000000000000100000001000000010000000001011111
...
![Page 15: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/15.jpg)
Por que encoding?▒ A resposta correta é:
▒ Todas são diferentes formas de enxergar a mesma coisa
![Page 16: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/17.jpg)
Informação=
dados + formade interpretá-los
![Page 18: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/19.jpg)
Encoding▒ Voltando à pergunta: onde NÃO usa encoding?▒ Em lugar nenhum. Tudo usa encoding!
![Page 20: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/21.jpg)
Character encoding▒ Um character encoding é uma determinada maneira de se representar caracteres
![Page 22: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/22.jpg)
Parte 2
Como (não) funciona
Por que dá errado
![Page 23: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/25.jpg)
![Page 26: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/26.jpg)
ASCII▒ American Standard Code for Information Interchange
▒ 7 bits
▒ 128 diferentes caracteres
![Page 27: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/27.jpg)
ASCII▒ Exemplos:
ASCII Decimal Hexa Binário
5 53 0x35 0110101
A 65 0x41 1000001
} 125 0x7D 1111101
![Page 28: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/28.jpg)
ASCII▒ Intervalo válido
▒ Em decimal: 0 – 127▒ Em binário: 0000000 – 1111111▒ Em hexadecimal: 0x00 – 0x7F
![Page 29: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/29.jpg)
ASCII▒ Somente 128 caracteres...
▒ Nenhum caractere acentuado
![Page 30: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/30.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/31.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/32.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/33.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/34.jpg)
Extensões para ASCII▒ Codepages
▒ 863 — French (Quebec French) ▒ 865 — Danish/Norwegian▒ 866 — Cyrillic ▒ 869 — Greek ▒ 874 — Thai
![Page 35: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/35.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/36.jpg)
![Page 37: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/37.jpg)
![Page 38: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/38.jpg)
ASCII▒ No fim das contas, ficou assim:
▒ 0x00 – 0x7F: ASCII normal▒ 0x80 – 0xFF: ASCII estendido
![Page 39: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/39.jpg)
ASCII▒ Na prática:
▒ 0x00 – 0x7F: blz! ▒ 0x80 – 0xFF: não blz
![Page 40: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/40.jpg)
ASCII▒ E por que de 0x80 a 0xFF é “não blz”?
▒ Já vamos ver por quê...
![Page 41: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/41.jpg)
Encodings▒ No Brasil, o codepage 850 era muito usado
![Page 42: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/42.jpg)
Exemplo▒ Você, aqui no Brasil, gostaria de dar o seu olá
▒ Se você escrever:▒ Ola!
![Page 43: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/43.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/44.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/45.jpg)
Exemplo▒ Blz !
▒ O l a !▒ ↑ ↑ ↑ ↑▒ 0x4F 0x6C 0x61 0x21
![Page 46: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/46.jpg)
Exemplo▒ Qualquer computador que entenda ASCII (e todos entendem) vai conseguir processar corretamente a sua informação
![Page 47: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/47.jpg)
Exemplo▒ E se a gente escrever...
▒ Olá!
![Page 48: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/48.jpg)
Exemplo▒ Blz !▒ Pois:
▒ O l á !▒ ↑ ↑ ↑ ↑▒ 0x4F 0x6C 0xE1 0x21
![Page 49: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/49.jpg)
Exemplo▒ Até você tentar ler isso num computador russo e...
![Page 50: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/50.jpg)
Exemplo▒ Não blz ▒ Pois:
▒ O l р !▒ ↑ ↑ ↑ ↑▒ 0x4F 0x6C 0xE1 0x21
![Page 51: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/51.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/52.jpg)
![Page 53: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/53.jpg)
![Page 54: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/54.jpg)
Exemplo▒ Ou seja:
![Page 55: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/55.jpg)
Exemplo▒ Não blz ▒ Pois:
▒ O l á !▒ ↑ ↑ ↑ ↑▒ 0x4F 0x6C ???? 0x21
![Page 56: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/56.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/57.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/58.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/59.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/60.jpg)
Encodings▒ Seria necessário...
▒ Um código...▒ Um código único...▒ Um único código...▒ Um...
![Page 61: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/61.jpg)
UNICODE!!
![Page 62: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/62.jpg)
Unicode▒ O que é Unicode?
![Page 63: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/63.jpg)
![Page 64: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/64.jpg)
The Unicode 5.0 Standard
▒ 1472 páginas▒ É grande
![Page 65: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/65.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/66.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/67.jpg)
UCS▒ Exemplos:
▒ U+0058: X▒ U+00E3: ã▒ U+2603: ☃▒ U+10123:
![Page 68: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/68.jpg)
UCS▒ Caracteres na tabela são abstratos (são informação)
▒ Para concretizá-los, é necessário um encoding
![Page 69: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/69.jpg)
Encodings Unicode▒ Maneiras de transformar caracteres abstratos em concretos
▒ Três principais: UTF-8, UTF-16, UTF-32
![Page 70: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/70.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/71.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/72.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/73.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/74.jpg)
UCS e UTF▒ O que eu preciso saber disso tudo?
▒ Apenas o seguinte:
![Page 75: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/75.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/76.jpg)
No mundo real de hoje▒ Encodings mais usados nos sistemas que rodam no Brasil:▒ UTF-8▒ LATIN-1
![Page 77: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/77.jpg)
LATIN-1▒ Serve para caracteres Unicode?
![Page 78: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/78.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/79.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/80.jpg)
LATIN-1 e UTF-8▒ Agora que já vimos LATIN-1 e UTF-8, voltemos à seguinte questão:
![Page 81: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/81.jpg)
LATIN-1 e UTF-8▒ Por que “José” vira “José”???
![Page 82: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/82.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/83.jpg)
LATIN-1 e UTF-8▒ E se você enviar esses bytes
0x4A 0x6F 0x73 0xC3 0xA9
para alguém?
![Page 84: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/84.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/85.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/86.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/87.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/88.jpg)
Parte 3
Como faz pra dar certo
![Page 89: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/89.jpg)
Informação=
dados + formade interpretá-los
![Page 90: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/90.jpg)
Informação String
= =
Dados Bytes
+ +
Forma de interpretá-los
Encoding
![Page 91: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/91.jpg)
String..
=..bytes + encoding
![Page 92: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/92.jpg)
Não existe string sem encoding!
![Page 93: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/93.jpg)
Não existe relação byte caractere sem encoding!
![Page 94: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/94.jpg)
Como faz pra dar certo▒ 2 dicas para evitar problemas de encoding:
![Page 95: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/95.jpg)
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ção</p>
![Page 96: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/96.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/97.jpg)
Como faz pra dar certo▒ Exemplos:
![Page 98: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/98.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/99.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/100.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/101.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/102.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/103.jpg)
!!!!!!!!!!!
!!ERRADO!!
!!!!!!!!!!!
![Page 104: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/104.jpg)
![Page 105: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/105.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/106.jpg)
Como faz pra dar certo▒ Plataformas MUDAM!▒ Configurações de ambiente MUDAM!▒ Encoding padrão MUDA!
![Page 107: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/107.jpg)
Java: jeito errado▒ byte[] meusBytes =
string.getBytes();
▒ String minhaString =new String(bytes);
![Page 108: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/108.jpg)
Java: jeito certo▒ byte[] meusBytes =
string.getBytes("UTF-8");
▒ String minhaString =new String(bytes, "UTF-8");
![Page 109: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/109.jpg)
Demonstração...
![Page 110: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/110.jpg)
Conclusões▒ Problemas de encoding acontecem nas melhores famílias
![Page 111: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/111.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/112.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/113.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/114.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/115.jpg)
Referências▒ Lista de caracteres Unicode e suas diferentes representações▒ http://www.fileformat.info/info/unicode/
![Page 116: Minicurso Encoding - TDC2012](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/116.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022050808/556412ddd8b42a0d0c8b5380/html5/thumbnails/117.jpg)
Contatos▒ André Willik Valenti
▒ [email protected]▒ @awvFi
▒ Andrei de Oliveira Tognolo▒ [email protected]▒ /andreitognolo