Minicurso de   EncodingAndré Willik Valenti (Daitan)   Andrei Tognolo (Dextra)The Developer’s Conference 2012
Roteiro▒ Parte 1  ▒ O que é e por que existe▒ Parte 2  ▒ Como funciona  ▒ Por que dá errado▒ Parte 3  ▒ Como faz pra dar c...
Parte 1   O que é e por que existe
Encoding? Hein!?▒ Mais especificamente: ▒ Character encoding▒ Também conhecido como: ▒ Codificação de caracteres ▒ Charset
Quem é o encoding?▒ O encoding é o culpado por: ▒ Programação    Programação    Programa 褯 ▒ José Luís Assunção Júnior...
Por que encoding?▒ Por que se usa encoding? ▒ Onde NÃO se usa encoding? ▒ Segure essa ideia!▒ Computador é uma máquina de ...
Por que encoding?▒ Veja esta imagem
Por que encoding?▒ Esta imagem é uma informação▒ Como a gente representa essa  informação no computador?
Por que encoding?▒ Formato da imagem é JPEG▒ Mas o que é uma imagem JPEG?▒ Podemos olhar para “uma imagem  JPEG” sob quais...
Uma imagem mesmo?
Um monte de pixels?
Um monte de bytes?
Um grande número binário? 11111111110110001111111111100000 00000000000100000100101001000110 100100101000110000000000000000...
Por que encoding?▒ A resposta correta é: ▒ Todas são diferentes formas de   enxergar a mesma coisa
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 + formade interpretá-los
Resumindo▒ Informação  ▒ O conceito abstrato a ser representado  ▒ Exemplo: imagem▒ Dados  ▒ Representação concreta de inf...
Encoding▒ Voltando à pergunta: onde NÃO  usa encoding? ▒ Em lugar nenhum. Tudo usa encoding!
Encoding▒   PNG é um encoding▒   JPEG é um encoding▒   MPEG é um encoding▒   MP3 é um encoding▒   PDF é um encoding▒   ......
Character encoding▒ Um character encoding é uma  determinada maneira de se  representar caracteres
Parte 2     Como (não) funciona     Por que dá errado
História▒ Década de 60  ▒ Mais de 60 maneiras diferentes de    representar caracteres  ▒ Cada fabricante implementava do s...
História▒ Bob Bemer:  ▒ “Vamos uniformizar esse negócio...”▒ Formou­se um comitê do ANSI  (American National Standards  In...
ASCII▒ American Standard Code for  Information Interchange▒ 7 bits▒ 128 diferentes caracteres
ASCII▒ Exemplos:   ASCII      Decimal   Hexa   Binário     5           53     0x35   0110101      A         65      0x41  ...
ASCII▒ Intervalo válido ▒ Em decimal:           0 – 127 ▒ Em binário:     0000000 – 1111111 ▒ Em hexadecimal:    0x00 – 0x7F
ASCII▒ Somente 128 caracteres...▒ Nenhum caractere acentuado 
ASCII▒ Em vez de usar apenas 7 bits,  muitas máquinas usavam/usam 8▒ E esse bit sobrando aí? ▒ Já sei!!! ▒ Vamos usar pra ...
ASCII▒ Com 8 bits, conseguimos  representar 256 diferentes  caracteres▒ Intervalo válido: ▒    0 – 255    (em decimal) ▒ 0...
Extensões para ASCII▒ Codepages ▒ 437 — The original IBM PC code page ▒ 720 — Arabic ▒ 737 — Greek ▒ 775 — Estonian, Lithu...
Extensões para ASCII▒ Codepages ▒ 852 — "Slavic (Latin­2)" (Central   and Eastern European languages) ▒ 855 — Cyrillic ▒ 8...
Extensões para ASCII▒ Codepages ▒ 863   —   French (Quebec French) ▒ 865   —   Danish/Norwegian ▒ 866   —   Cyrillic ▒ 869...
ASCII▒ Maravilha! Com dezenas de encodings  diferentes, todos poderão representar  seus caracteres!▒ Mas e a interoperabil...
ASCII▒ No fim das contas, ficou assim: ▒ 0x00 – 0x7F: ASCII normal ▒ 0x80 – 0xFF: ASCII estendido
ASCII▒ Na prática:  ▒ 0x00 – 0x7F: blz!   ▒ 0x80 – 0xFF: não blz 
ASCII▒ E por que de 0x80 a 0xFF é “não  blz”?▒ Já vamos ver por quê...
Encodings▒ No Brasil, o codepage 850 era  muito usado
Exemplo▒ Você, aqui no Brasil, gostaria  de dar o seu olá▒ Se você escrever: ▒ Ola!
Exemplo▒ Essa sua sequência de 4 caracteres é  uma informação▒ Informação só existe na cabeça dos  seres humanos▒ Computad...
Exemplo▒ Para um computador, não existe: ▒ Ola!▒ O que existe são estes 4 bytes  (ASCII): ▒ 0x4F   0x6C   0x61   0x21    (...
Exemplo▒ Blz ! ▒ O        l      a       ! ▒ ↑        ↑      ↑       ↑ ▒ 0x4F    0x6C   0x61   0x21
Exemplo▒ Qualquer computador que entenda  ASCII (e todos entendem) vai  conseguir processar corretamente  a sua informação
Exemplo▒ E se a gente escrever... ▒ Olá!
Exemplo▒ Blz !▒ Pois: ▒ O        l      á       ! ▒ ↑        ↑      ↑       ↑ ▒ 0x4F    0x6C   0xE1   0x21
Exemplo▒ Até você tentar ler isso num  computador russo e...
Exemplo▒ Não blz ▒ Pois: ▒ O       l      р       ! ▒ ↑       ↑      ↑       ↑ ▒ 0x4F   0x6C   0xE1   0x21
Exemplo▒ Quem foi que falou que 0xE1  corresponde ao caractere á??? ▒ Codepage 850 falou!▒ Mas codepage 855 falou que 0xE1...
Exemplo▒ Ou seja:
Exemplo▒ Não blz ▒ Pois: ▒ O       l      á       ! ▒ ↑       ↑      ↑       ↑ ▒ 0x4F   0x6C   ????   0x21
Encodings▒ Não existe uma forma única de  representar o caractere á▒ A sequência de bytes é ambígua: ▒ 0x4F   0x6C   0xE1 ...
Encodings▒ Mas e se...▒ ...a gente enviar para o computador  russo o seguinte:  ▒ A sequência de bytes         +  ▒ O enco...
ISO­8859­1▒ Também conhecido como LATIN­1▒ Mesma ideia dos ASCII  estendidos: ▒ 255 caracteres ▒ Compatível com ASCII
Encodings▒ É óbvio que não iria dar certo o  mundo inteiro tentando se  comunicar cada um usando seu  encoding específico▒...
Encodings▒ Seria necessário... ▒ Um código... ▒ Um código único... ▒ Um único código... ▒ Um...
UNICODE!!
Unicode▒ O que é Unicode?
The Unicode 5.0 Standard▒ 1472 páginas▒ É grande 
O que é Unicode?▒ Duas partes interessantes para  nós nesse momento: ▒ UCS   ▒ Universal Character Set ▒ Encodings   ▒ UTF...
UCS▒ Tabela gigante de caracteres▒ Cada caractere possui um código,  chamado code point ▒ Code point é representado por U+...
UCS▒ Exemplos:  ▒ U+0058:    X  ▒ U+00E3:    ã  ▒ U+2603:    ☃  ▒ U+10123:
UCS▒ Caracteres na tabela são  abstratos (são informação)▒ Para concretizá­los, é  necessário um encoding
Encodings Unicode▒ Maneiras de transformar  caracteres abstratos em  concretos▒ Três principais: UTF­8, UTF­16,  UTF­32
UTF­32▒ Exemplos:  ▒ U+0058:    0x00   0x00   0x00   0x58  ▒ U+00E3:    0x00   0x00   0x00   0xE3  ▒ U+2603:    0x00   0x0...
UTF­16▒ Exemplos:  ▒ U+0058:                  0x00   0x58  ▒ U+00E3:                  0x00   0xE3  ▒ U+2603:              ...
UTF­8▒ Exemplos:  ▒ U+0058:                         0x58  ▒ U+00E3:                  0xC3   0xA3  ▒ U+2603:           0xE2...
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...
UCS e UTF▒ O que eu preciso saber disso  tudo?▒ Apenas o seguinte:
UCS e UTF▒ Tabela de caracteres ≠ encoding▒ Existem formas diferentes de se  representar caracteres Unicode. A  mais comum...
No mundo real de hoje▒ Encodings mais usados nos  sistemas que rodam no Brasil: ▒ UTF­8 ▒ LATIN­1
LATIN­1▒ Serve para caracteres Unicode?
LATIN­1▒ NÃO é um encoding para Unicode ▒ Usa exatamente 1 byte por caractere ▒ 1 byte não seria suficiente▒ Mesma ideia d...
LATIN­1 e UTF­8▒ Exemplos              Bytes usando Bytes usando  Caractere                  UTF-8      LATIN-1      X    ...
LATIN­1 e UTF­8▒ Agora que já vimos LATIN­1 e  UTF­8, voltemos à seguinte  questão:
LATIN­1 e UTF­8▒ Por que “José” vira “José”???
LATIN­1 e UTF­8▒ “José” em UTF­8: ▒ J        o         s         é ▒ ↑        ↑         ↑         ↑ ▒ 0x4A    0x6F      0x...
LATIN­1 e UTF­8▒ E se você enviar esses bytes   0x4A   0x6F   0x73   0xC3   0xA9 para alguém?
LATIN­1 e UTF­8▒ Se a pessoa ler em UTF­8, blz! ▒ 0x4A   0x6F   0x73   0xC3       0xA9 ▒   ↓     ↓       ↓           ↓ ▒  ...
LATIN­1 e UTF­8▒ Mas e se ela ler em LATIN­1? ▒ 0x4A   0x6F   0x73   0xC3   0xA9 ▒ ↓       ↓       ↓      ↓      ↓ ▒   J  ...
LATIN­1 e UTF­8▒ Se você não avisar que o seu  texto está em UTF­8, como a  pessoa vai adivinhar?
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­...
Parte 3    Como faz pra dar certo
Informação        =  dados + formade interpretá-los
Informação      String      =             =    Dados         Bytes      +             +   Forma de                 Encodin...
String..       =..bytes + encoding
Não existe string  sem encoding!
Não existe relação byte  caractere   sem encoding!
Como faz pra dar certo▒ 2 dicas para evitar problemas de  encoding:
Como faz pra dar certo▒ 1) Use sequências de escape  sempre que possível▒ Para escrever “Programação”: ▒ Em Java:   ▒ "Pro...
Como faz pra dar certo▒ 2) Faça conversões só quando  realmente for necessário▒ Ao fazer qualquer conversão, SEMPRE  espec...
Como faz pra dar certo▒ Exemplos:
Como faz pra dar certo▒ Você vai enviar texto em uma  requisição HTTP? ▒ Converta a string para bytes usando   algum encod...
Como faz pra dar certo▒ Certo:  ▒ Content-Type: text/plain; charset=utf-8  ▒ Content-Type: text/plain; charset=iso-8859-  ...
Como faz pra dar certo▒ Vai receber um XML? ▒ Receba o conteúdo (bytes) ▒ Repasse os bytes para a sua   biblioteca de proc...
Como faz pra dar certo▒ “Tem que passar o encoding, tem  que passar encoding...”▒ E se eu não passar o encoding?  Não func...
Como faz pra dar certo▒ Funciona!  ▒ ...às vezes!▒ O que acontece se eu não  especificar encoding?  ▒ Nenhum encoding será...
!!!!!!!!!!!!!ERRADO!!!!!!!!!!!!!
Como faz pra dar certo▒ Se você não especificar  encoding, será usado o encoding  padrão da plataforma▒ E isso é   ERRADO!...
Como faz pra dar certo▒ Plataformas MUDAM!▒ Configurações de ambiente MUDAM!▒ Encoding padrão MUDA!
Java: jeito errado▒ byte[] meusBytes =    string.getBytes();▒ String minhaString =    new String(bytes);
Java: jeito certo▒ byte[] meusBytes =    string.getBytes("UTF­8");▒ String minhaString =    new String(bytes, "UTF­8");
Demonstração...
Conclusões▒ Problemas de encoding acontecem  nas melhores famílias
Conclusões▒ Qualquer peça do quebra­cabeça  pode estragar tudo▒ Programação defensiva costuma  ser a melhor (e talvez a ún...
Conclusões▒ Causas são sempre as mesmas: ▒ String sendo lida e/ou escrita   usando o encoding errado ▒ Uso indevido do enc...
Conclusões▒ Apenas reforçando: ▒ Não existe informação sem forma de   interpretação ▒ Não existe string sem encoding
Referências▒ The Unicode Consortium  ▒ http://unicode.org/▒ The Absolute Minimum Every Software  Developer Absolutely, Pos...
Referências▒ Lista de caracteres Unicode e  suas diferentes representações ▒ http://www.fileformat.info/info/unicode/
Referências▒ ASCII  ▒ http://en.wikipedia.org/wiki/ASCII▒ Unicode  ▒ http://en.wikipedia.org/wiki/Unicode▒ UTF­8  ▒ http:/...
Contatos▒ André Willik Valenti ▒ awvalenti@gmail.com ▒ @awvFi▒ Andrei de Oliveira Tognolo ▒ andreitognolo@gmail.com ▒ /and...
Minicurso Encoding  - TDC 2012
Minicurso Encoding  - TDC 2012
Minicurso Encoding  - TDC 2012
Minicurso Encoding  - TDC 2012
Minicurso Encoding  - TDC 2012
Minicurso Encoding  - TDC 2012
Minicurso Encoding  - TDC 2012
Minicurso Encoding  - TDC 2012
Próximos SlideShares
Carregando em…5
×

Minicurso Encoding - TDC 2012

821 visualizações

Publicada em

por André Willik Valenti e Andrei Tognolo

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
821
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
6
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Minicurso Encoding - TDC 2012

  1. 1. Minicurso de EncodingAndré Willik Valenti (Daitan) Andrei Tognolo (Dextra)The Developer’s Conference 2012
  2. 2. Roteiro▒ Parte 1 ▒ O que é e por que existe▒ Parte 2 ▒ Como funciona ▒ Por que dá errado▒ Parte 3 ▒ Como faz pra dar certo
  3. 3. Parte 1 O que é e por que existe
  4. 4. Encoding? Hein!?▒ Mais especificamente: ▒ Character encoding▒ Também conhecido como: ▒ Codificação de caracteres ▒ Charset
  5. 5. 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 題 uAssun 褯 Jr
  6. 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!
  7. 7. Por que encoding?▒ Veja esta imagem
  8. 8. Por que encoding?▒ Esta imagem é uma informação▒ Como a gente representa essa informação no computador?
  9. 9. Por que encoding?▒ Formato da imagem é JPEG▒ Mas o que é uma imagem JPEG?▒ Podemos olhar para “uma imagem JPEG” sob quais pontos de vista?
  10. 10. Uma imagem mesmo?
  11. 11. Um monte de pixels?
  12. 12. Um monte de bytes?
  13. 13. Um grande número binário? 11111111110110001111111111100000 00000000000100000100101001000110 10010010100011000000000000000010 0000001000000010000000001011111 ...
  14. 14. Por que encoding?▒ A resposta correta é: ▒ Todas são diferentes formas de enxergar a mesma coisa
  15. 15. 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
  16. 16. Informação = dados + formade interpretá-los
  17. 17. 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
  18. 18. Encoding▒ Voltando à pergunta: onde NÃO usa encoding? ▒ Em lugar nenhum. Tudo usa encoding!
  19. 19. Encoding▒ PNG é um encoding▒ JPEG é um encoding▒ MPEG é um encoding▒ MP3 é um encoding▒ PDF é um encoding▒ ...▒ Alguém já usou algum CODEC?
  20. 20. Character encoding▒ Um character encoding é uma determinada maneira de se representar caracteres
  21. 21. Parte 2 Como (não) funciona Por que dá errado
  22. 22. História▒ Década de 60 ▒ Mais de 60 maneiras diferentes de representar caracteres ▒ Cada fabricante implementava do seu jeito
  23. 23. 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...
  24. 24. ASCII▒ American Standard Code for Information Interchange▒ 7 bits▒ 128 diferentes caracteres
  25. 25. ASCII▒ Exemplos: ASCII Decimal Hexa Binário 5 53 0x35 0110101 A 65 0x41 1000001 } 125 0x7D 1111101
  26. 26. ASCII▒ Intervalo válido ▒ Em decimal: 0 – 127 ▒ Em binário: 0000000 – 1111111 ▒ Em hexadecimal: 0x00 – 0x7F
  27. 27. ASCII▒ Somente 128 caracteres...▒ Nenhum caractere acentuado 
  28. 28. 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!
  29. 29. ASCII▒ Com 8 bits, conseguimos representar 256 diferentes caracteres▒ Intervalo válido: ▒ 0 – 255 (em decimal) ▒ 0x00 – 0xFF (em hexadecimal)
  30. 30. 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)
  31. 31. 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
  32. 32. Extensões para ASCII▒ Codepages ▒ 863 — French (Quebec French) ▒ 865 — Danish/Norwegian ▒ 866 — Cyrillic ▒ 869 — Greek ▒ 874 — Thai
  33. 33. 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:
  34. 34. ASCII▒ No fim das contas, ficou assim: ▒ 0x00 – 0x7F: ASCII normal ▒ 0x80 – 0xFF: ASCII estendido
  35. 35. ASCII▒ Na prática: ▒ 0x00 – 0x7F: blz!  ▒ 0x80 – 0xFF: não blz 
  36. 36. ASCII▒ E por que de 0x80 a 0xFF é “não blz”?▒ Já vamos ver por quê...
  37. 37. Encodings▒ No Brasil, o codepage 850 era muito usado
  38. 38. Exemplo▒ Você, aqui no Brasil, gostaria de dar o seu olá▒ Se você escrever: ▒ Ola!
  39. 39. 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.
  40. 40. 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)
  41. 41. Exemplo▒ Blz ! ▒ O l a ! ▒ ↑ ↑ ↑ ↑ ▒ 0x4F 0x6C 0x61 0x21
  42. 42. Exemplo▒ Qualquer computador que entenda ASCII (e todos entendem) vai conseguir processar corretamente a sua informação
  43. 43. Exemplo▒ E se a gente escrever... ▒ Olá!
  44. 44. Exemplo▒ Blz !▒ Pois: ▒ O l á ! ▒ ↑ ↑ ↑ ↑ ▒ 0x4F 0x6C 0xE1 0x21
  45. 45. Exemplo▒ Até você tentar ler isso num computador russo e...
  46. 46. Exemplo▒ Não blz ▒ Pois: ▒ O l р ! ▒ ↑ ↑ ↑ ↑ ▒ 0x4F 0x6C 0xE1 0x21
  47. 47. Exemplo▒ Quem foi que falou que 0xE1 corresponde ao caractere á??? ▒ Codepage 850 falou!▒ Mas codepage 855 falou que 0xE1 equivale a р!▒ Quem está certo???
  48. 48. Exemplo▒ Ou seja:
  49. 49. Exemplo▒ Não blz ▒ Pois: ▒ O l á ! ▒ ↑ ↑ ↑ ↑ ▒ 0x4F 0x6C ???? 0x21
  50. 50. Encodings▒ Não existe uma forma única de representar o caractere á▒ A sequência de bytes é ambígua: ▒ 0x4F 0x6C 0xE1 0x21
  51. 51. 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!
  52. 52. ISO­8859­1▒ Também conhecido como LATIN­1▒ Mesma ideia dos ASCII estendidos: ▒ 255 caracteres ▒ Compatível com ASCII
  53. 53. 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
  54. 54. Encodings▒ Seria necessário... ▒ Um código... ▒ Um código único... ▒ Um único código... ▒ Um...
  55. 55. UNICODE!!
  56. 56. Unicode▒ O que é Unicode?
  57. 57. The Unicode 5.0 Standard▒ 1472 páginas▒ É grande 
  58. 58. 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)
  59. 59. 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
  60. 60. UCS▒ Exemplos: ▒ U+0058: X ▒ U+00E3: ã ▒ U+2603: ☃ ▒ U+10123:
  61. 61. UCS▒ Caracteres na tabela são abstratos (são informação)▒ Para concretizá­los, é necessário um encoding
  62. 62. Encodings Unicode▒ Maneiras de transformar caracteres abstratos em concretos▒ Três principais: UTF­8, UTF­16, UTF­32
  63. 63. 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
  64. 64. UTF­16▒ Exemplos: ▒ U+0058: 0x00 0x58 ▒ U+00E3: 0x00 0xE3 ▒ U+2603: 0x26 0x03 ▒ U+10123: 0xD8 0x00 0xDD 0x23
  65. 65. UTF­8▒ Exemplos: ▒ U+0058: 0x58 ▒ U+00E3: 0xC3 0xA3 ▒ U+2603: 0xE2 0x98 0x83 ▒ U+10123: 0xF0 0x90 0x84 0xA3
  66. 66. 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
  67. 67. UCS e UTF▒ O que eu preciso saber disso tudo?▒ Apenas o seguinte:
  68. 68. 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)
  69. 69. No mundo real de hoje▒ Encodings mais usados nos sistemas que rodam no Brasil: ▒ UTF­8 ▒ LATIN­1
  70. 70. LATIN­1▒ Serve para caracteres Unicode?
  71. 71. 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
  72. 72. LATIN­1 e UTF­8▒ Exemplos Bytes usando Bytes usando Caractere UTF-8 LATIN-1 X 0x58 0x58 Ã 0xC3 0xA3 0xE3 ☃ 0xE2 0x98 0x83 Não existe
  73. 73. LATIN­1 e UTF­8▒ Agora que já vimos LATIN­1 e UTF­8, voltemos à seguinte questão:
  74. 74. LATIN­1 e UTF­8▒ Por que “José” vira “José”???
  75. 75. 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
  76. 76. LATIN­1 e UTF­8▒ E se você enviar esses bytes 0x4A 0x6F 0x73 0xC3 0xA9 para alguém?
  77. 77. LATIN­1 e UTF­8▒ Se a pessoa ler em UTF­8, blz! ▒ 0x4A 0x6F 0x73 0xC3 0xA9 ▒ ↓ ↓ ↓ ↓ ▒ J o s é
  78. 78. LATIN­1 e UTF­8▒ Mas e se ela ler em LATIN­1? ▒ 0x4A 0x6F 0x73 0xC3 0xA9 ▒ ↓ ↓ ↓ ↓ ↓ ▒ J o s à ©
  79. 79. LATIN­1 e UTF­8▒ Se você não avisar que o seu texto está em UTF­8, como a pessoa vai adivinhar?
  80. 80. 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
  81. 81. Parte 3 Como faz pra dar certo
  82. 82. Informação = dados + formade interpretá-los
  83. 83. Informação String = = Dados Bytes + + Forma de Encodinginterpretá­los
  84. 84. String.. =..bytes + encoding
  85. 85. Não existe string sem encoding!
  86. 86. Não existe relação byte  caractere sem encoding!
  87. 87. Como faz pra dar certo▒ 2 dicas para evitar problemas de encoding:
  88. 88. 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&ccedil;&atilde;o</p>
  89. 89. 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
  90. 90. Como faz pra dar certo▒ Exemplos:
  91. 91. 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
  92. 92. 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!)
  93. 93. 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
  94. 94. 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?
  95. 95. Como faz pra dar certo▒ Funciona! ▒ ...às vezes!▒ O que acontece se eu não especificar encoding? ▒ Nenhum encoding será usado! ▒ Certo!?
  96. 96. !!!!!!!!!!!!!ERRADO!!!!!!!!!!!!!
  97. 97. 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!
  98. 98. Como faz pra dar certo▒ Plataformas MUDAM!▒ Configurações de ambiente MUDAM!▒ Encoding padrão MUDA!
  99. 99. Java: jeito errado▒ byte[] meusBytes = string.getBytes();▒ String minhaString = new String(bytes);
  100. 100. Java: jeito certo▒ byte[] meusBytes = string.getBytes("UTF­8");▒ String minhaString = new String(bytes, "UTF­8");
  101. 101. Demonstração...
  102. 102. Conclusões▒ Problemas de encoding acontecem nas melhores famílias
  103. 103. 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
  104. 104. 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
  105. 105. Conclusões▒ Apenas reforçando: ▒ Não existe informação sem forma de interpretação ▒ Não existe string sem encoding
  106. 106. 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.
  107. 107. Referências▒ Lista de caracteres Unicode e suas diferentes representações ▒ http://www.fileformat.info/info/unicode/
  108. 108. 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
  109. 109. Contatos▒ André Willik Valenti ▒ awvalenti@gmail.com ▒ @awvFi▒ Andrei de Oliveira Tognolo ▒ andreitognolo@gmail.com ▒ /andreitognolo

×