Desvendando os mistérios do Charset

990 views

Published on

Quem nunca passou vergonha na hora de apresentar um software recém implementado e se surpreendeu com caracteres estranhos e misteriosos tomando o lugar da acentuação das palavras? Esse tipo de problema é extremamente comum e costuma acompanhar a maior parte dos desenvolvedores de software ao longo de suas vidas profissionais. Tentar resolver na base da tentativa e erro ou ainda recorrendo a outros tipos de ciências esotéricas pode não dar certo e ainda prolongar o sofrimento. Na maior parte das vezes é extremamente simples resolver esse tipo de mal entendido entre diferentes sistemas de codificação, no entanto, como várias partes do software e principalmente de seu ambiente são afetadas, pode ser traumático encontrar o local exato para efetuar os ajustes. Nesta palestra, vamos a fundo nas raízes do problema desde os primórdios do código morse e da tabela ASCII até o nascimento do padrão Unicode para explicar como funcionam os mecanismos de conversão de bytes dentro das entranhas do Java.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
990
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide
  • Desmistificando o Charset
  • Palestralivre – Podemcopiarem http://www.slideshare.net/rodrigobranas
  • Eujápasseivergonhaemapresentarcaracteresestranhos!
  • Quemjápassouporisso?
  • Exemplo de caracteresestranhos
  • Qualé a forma maiscomum de resolver essetipo de problema?
  • Resoluçãosempreenvolveciênciasesotéricas. Alterarparâmetrosquenão se sabeaocertoparaque serve, modificarimplementaçãooucriartratadoresestão entre as soluçõesmaisusadas.
  • Tentativa e erro.Saialterandoqualquercoisaquepossua o nome charset paraqualquercoisadiferente do queestáquevaidarcerto.Nemsempre.
  • Vamoscomeçar do início
  • Telégrafo - 1836
  • Nenhumainvençãorevolucionoumais o mundo de forma tãoespetacularquanto o telégrafo, capaz de levarmensagensatravés de mares e continentes.
  • Como funciona um telégrafo?
  • Transmissãoempulsoseletricos
  • Como fazerparaentenderospulsoselétricos?
  • Codigo Morse!
  • Tabela do códigomorse
  • Imaginemalguémna Russia, alfabetocirílico, tentando se comunicar com alguémnosestadosunidos?
  • Seráquenaquelaépocanóstinhamosproblemas de charset? Comcerteza!
  • Alfabetocirilico
  • Na computaçãonãofoidiferente. Tambémestariamosreservadososmesmosproblemas.
  • Tudoébaseadoemnúmerosbinários. Nossomeio de representaçãomudou.
  • No início erabagunça. Cada um faz o seu.
  • Antes de 1963, cadafabricantetinha o seupróprio charset, o quecausavaproblemas com a interoperabilidade entre diferentesfabricantes.
  • Apenas a IBM possuia 9diferentestipos de charset
  • Apenas a IBM possuia 9diferentestipos de charset
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Tabela ASCII
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Tabela ASCII
  • Sentemfalta de algo? Porque 7 bits?Redução de custos!
  • Tudobematétentarutlizar com idiomasquenãofossem o inglês
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Começou a sacanagemnovamente
  • E se colocarmosmais 1 bit?
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Vamosverossabores
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • O problema de certa formaaindaestavalonge de serresolvido. Com apenas 8 bits nãoépossívelrepresentar a maior parte dos idiomasorientaisquepossuemmuitosideogramasdiferentes
  • O problema de certa formaaindaestavalonge de serresolvido. Com apenas 8 bits nãoépossívelrepresentar a maior parte dos idiomasorientaisquepossuemmuitosideogramasdiferentes
  • A sacanagemvolta a tomarconta. E se colocarmosmais 8 bits? Charset com 16 bits. O problema da interoperabilidadeatacanovamente!
  • Surgimento da tabelaASCII em 1963. Falar um poucosobre a história
  • Para com essaporra!
  • Surgimento do Unicode
  • O queé o Unicode?
  • O queé o Unicode?
  • O queé o Unicode?
  • O queé o Unicode?
  • O queé o Unicode?
  • O queé o Unicode?
  • O queé o Unicode?
  • Histórico das versões e a quantidade de code points alocados.
  • Histórico das versões e a quantidade de code points alocados.
  • Histórico das versões e a quantidade de code points alocados.
  • O Unicode tem mais de 1 byte, dessa forma eleprecisa de um encoding paraserconvertidoem bytes.
  • Como codificar o Unicode?
  • Code points
  • Code points
  • Code points
  • Code points
  • Code points
  • Algoritmos de codificaçãopara o Unicode. UTF e UCS
  • Algoritmos de codificaçãopara o Unicode. UTF e UCS
  • Algoritmos de codificaçãopara o Unicode. UTF e UCS
  • Algoritmos de codificaçãopara o Unicode. UTF e UCS
  • Algoritmos de codificaçãopara o Unicode. UTF e UCS
  • Algoritmos de codificaçãopara o Unicode. UTF e UCS
  • Algoritmos de codificaçãopara o Unicode. UTF e UCS
  • Explicando o UTF. Algoritmo de codificaçãopara Unicode de tamanhovariável, porissoreduz a quantidade de espaçoocupado. UTF-8 écapaz de codificar de 1 a 4 bytes.
  • Code points
  • Code points
  • Entrando no mundo do Java
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Como a classe String representaoscaracteres? Array de char.
  • Detalhes do tipo char
  • Detalhes do tipo char
  • Detalhes do tipo char
  • Detalhes do tipo char
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Formas de inicializarumavariável do tipo char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Cuidado, cada browser assume um padrão
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Exemplo 1 – Extraindo o conteúdo de uma String na forma de um array de char
  • Cuidado, cada browser assume um padrão
  • Em Java utilizamosinstâncias da classe String paraarmazenarconteúdo.
  • Desvendando os mistérios do Charset

    1. 1. Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.brDesvendando os mistérios do Charset Aprenda a evitar sofrimentos no furuto!
    2. 2. http://www.slideshare.net/rodrigobranas
    3. 3. @rodrigobranas rodrigo.branas@gmail.com http://www.agilecode.com.brFormação AcadêmicaCiências da Computação – UFSCGerenciamento de Projetos - FGVCertificaçõesSCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
    4. 4. Rodrigo Branas – rodrigo.branas@gmail.com10 anos de experiência na plataforma Java1000 horas em sala de aulaMais de 50 palestras em eventosLíder da área de desenvolvimento na GenneraAutor da revista Java MagazinePalestranteInstrutor da Academia Java e Agile da GlobalcodeCriador dos treinamentos de Clean Code, Selenium eMaven da Agile CodeTrabalhou com as empresas: EDS, HP, GM, Citibank,OnCast, Globalcode, V.Office, Dígitro, Softplan, Unimed,Suntech, Vale do Rio Doce, Senai, NET.
    5. 5. Qual é a forma mais comum deresolver esse tipo de problema?
    6. 6. Recorrendo a ciências esotéricas
    7. 7. Tentativa e erro... Nem sempre funciona
    8. 8. Começando pelo princípio...
    9. 9. A criação do Telégrafo - 1837
    10. 10. Meio revolucionário de comunicação
    11. 11. Transmissão de pulsos elétricos
    12. 12. Faz o que com os pulsos elétricos?
    13. 13. Samuel F. Morse
    14. 14. Esquecemos dos russos!
    15. 15. Código Morse - Cirílico
    16. 16. Era da computação
    17. 17. O negócio agora é em bytes
    18. 18. No início era carnaval!
    19. 19. Como fica a interoperabilidade?
    20. 20. 9 sistemas de codificação diferentes
    21. 21. Surgimento do ASCII Luz no fim do túnel
    22. 22. ASCII
    23. 23. ASCIIAmerican Standard Code for Information Interchange
    24. 24. ASCIIAmerican Standard Code for Information Interchange Publicado em 1963
    25. 25. ASCIIAmerican Standard Code for Information Interchange Publicado em 1963 7 bits ou 128 caracteres
    26. 26. Tabela ASCII
    27. 27. ASCIIAmerican Standard Code for Information Interchange Publicado em 1963 7 bits ou 128 caracteres 32 caracteres não imprimíveis (00 ~ 1F)
    28. 28. ASCIIAmerican Standard Code for Information Interchange Publicado em 1963 7 bits ou 128 caracteres 32 caracteres não imprimíveis (00 ~ 1F) 96 caracteres imprimíveis (20 ~ 7F)
    29. 29. ASCIIAmerican Standard Code for Information Interchange Publicado em 1963 7 bits ou 128 caracteres 32 caracteres não imprimíveis (00 ~ 1F) 96 caracteres imprimíveis (20 ~ 7F)Foi o sistema de codificação mais utilizado até 2007 (quando foi ultrapassado pelo UTF-8)
    30. 30. ASCIIAmerican Standard Code for Information Interchange Publicado em 1963 7 bits ou 128 caracteres 32 caracteres não imprimíveis (00 ~ 1F) 96 caracteres imprimíveis (20 ~ 7F)Foi o sistema de codificação mais utilizado até 2007 (quando foi ultrapassado pelo UTF-8) Deu origem ao sistema de codificação US-ASCII
    31. 31. Tabela ASCII
    32. 32. Só 7 bits?
    33. 33. Como ficam os outros idiomas?
    34. 34. Exemplos de caracteres comuns não suportados pelo ASCII: Ñ (Espanhol) É (Português) ß (Alemão) Å (Sueco) ő (Hungaro)
    35. 35. E se a gente colocar mais 1 bit?
    36. 36. Norma ISO 8859
    37. 37. Norma ISO 8859International Standard Organization
    38. 38. Norma ISO 8859 International Standard OrganizationConjunto de sistemas de codificação de 8 bits
    39. 39. Norma ISO 8859 International Standard OrganizationConjunto de sistemas de codificação de 8 bits Regionalizado (16 tipos)
    40. 40. Norma ISO 8859 International Standard OrganizationConjunto de sistemas de codificação de 8 bits Regionalizado (16 tipos) 96 novos caracteres! (Agora vai)
    41. 41. Norma ISO 8859 International Standard Organization Conjunto de sistemas de codificação de 8 bits Regionalizado (16 tipos) 96 novos caracteres! (Agora vai)Nascimento do sistema de codificação ISO-8859-x
    42. 42. Norma ISO 8859 International Standard Organization Conjunto de sistemas de codificação de 8 bits Regionalizado (16 tipos) 96 novos caracteres! (Agora vai)Nascimento do sistema de codificação ISO-8859-x Compatível com o ASCII por motivos óbvios
    43. 43. Vamos ver os sabores!
    44. 44. ISO-8859-1 Latin-1 Western Europe Um dos sitemas de codificação mais utilizados!Dinamarquês, Holandês, Inglês, Finlandês, Francês, Alemão, Italiano, Norueguês, Português, Romeno, Espanhol, Catalão e Sueco.
    45. 45. ISO-8859-2 Latin-2 Central Europa Menos utilizado!Bósnio, Polonês, Croata, Tcheco, Eslovaco, Esloveno, Sér vio e Húngaro.
    46. 46. ISO-8859-3 Latin-3 South Europe Menos utilizado!Turco, Maltês e Esperanto.
    47. 47. ISO-8859-4 Latin-4 North Europe Menos utilizado!Difícil até de pronunciar...
    48. 48. ISO-8859-5 Latin/CyrillicISO-8859-6 Latin/ArabicISO-8859-7 Latin/GreekISO-8859-8 Latin/HebrewISO-8859-9 Latin-5 TurkishISO-8859-10 Latin-6 NordicISO-8859-11 Latin ThaiISO-8859-12 Latin DevanagariISO-8859-13 Latin Baltic RimISO-8859-14 Latin CelticISO-8859-15 Latin-9 (Francês completo)ISO-8859-16 Latin-10 South-Eastern European
    49. 49. Só 8 bits?
    50. 50. Como ficam os japoneses nessa história?
    51. 51. Outros sistemas de codificação utilizados principalmente pelos idiomas japonês, chinês e coreano: Big5: Chinese, Japanese and Korean Institute of Information of Taiwan 2 bytes Shift JIS: Japanese ASCII Corporation and Microsoft Entre 1 e 2 bytes
    52. 52. Alguém tinha que acabarcom a bagunça!
    53. 53. Surgimento do Unicode Luz no fim do túnel
    54. 54. UnicodeUniversal Character Set
    55. 55. UnicodeUniversal Character Set Publicado em 1991
    56. 56. Unicode Universal Character Set Publicado em 1991Acabar com as limitações dos sistemas de caracteres(principalmente os pertencentes a norma ISO 8859)
    57. 57. Unicode Universal Character Set Publicado em 1991Acabar com as limitações dos sistemas de caracteres(principalmente os pertencentes a norma ISO 8859) Capacidade para 1.114.112 caracteres
    58. 58. Unicode Universal Character Set Publicado em 1991Acabar com as limitações dos sistemas de caracteres(principalmente os pertencentes a norma ISO 8859) Capacidade para 1.114.112 caracteres
    59. 59. Unicode Universal Character Set Publicado em 1991Acabar com as limitações dos sistemas de caracteres(principalmente os pertencentes a norma ISO 8859) Capacidade para 1.114.112 caracteres Primeiros 256 caracteres iguais aos do ISO-8859-1 (Compatibilidade reversa)
    60. 60. Unicode Universal Character Set Publicado em 1991 Acabar com as limitações dos sistemas de caracteres (principalmente os pertencentes a norma ISO 8859) Capacidade para 1.114.112 caracteres Primeiros 256 caracteres iguais aos do ISO-8859-1 (Compatibilidade reversa)Sendo assim, os 128 primeiros caracteres são iguais aos da tabela ASCII
    61. 61. Version Date Scripts CaracteresHistórico de versões 1.0 1991 24 7.161 1.0.1 1992 25 28.359 1.1 1993 24 34.233 2.0 1996 25 38.950 2.1 1998 25 38.952 3.0 1999 38 49.259 3.1 2001 41 94.205 3.2 2002 45 95.221 4.0 2003 52 96.447 4.1 2005 59 97.720 5.0 2006 64 99.089 5.1 2008 75 100.713 5.2 2009 90 107.361 6.0 2010 93 109.449 6.1 2012 100 110.181
    62. 62. Version Date Scripts CaracteresHistórico de versões 1.0 1991 24 7.161 1.0.1 1992 25 28.359 1.1 1993 24 34.233 2.0 1996 25 38.950 2.1 1998 25 38.952 3.0 1999 38 49.259 3.1 2001 41 94.205 3.2 2002 45 95.221 4.0 2003 52 96.447 4.1 2005 59 97.720 5.0 2006 64 99.089 5.1 2008 75 100.713 5.2 2009 90 107.361 6.0 2010 93 109.449 6.1 2012 100 110.181
    63. 63. Version Date Scripts CaracteresHistórico de versões 1.0 1991 24 7.161 1.0.1 1992 25 28.359 1.1 1993 24 34.233 2.0 1996 25 38.950 2.1 1998 25 38.952 3.0 1999 38 49.259 3.1 2001 41 94.205 3.2 2002 45 95.221 4.0 2003 52 96.447 4.1 2005 59 97.720 5.0 2006 64 99.089 5.1 2008 75 100.713 5.2 2009 90 107.361 6.0 2010 93 109.449 6.1 2012 100 110.181
    64. 64. Não dá pra representar o Unicode comoera feito com o ASCII e o ISO-8859-1?
    65. 65. O Unicode precisa ser codificado!
    66. 66. Imagine a palavra Maça
    67. 67. Imagine a palavra Maça M -> 4D a -> 61 ç -> E7 a -> 61
    68. 68. Imagine a palavra Maça M -> 4D a -> 61 ç -> E7 a -> 61O primeiro encoding para Unicode foi o UCS-2 M a ç a 004D 0061 00E7 0061
    69. 69. Imagine a palavra Maça M -> 4D a -> 61 ç -> E7 a -> 61O primeiro encoding para Unicode foi o UCS-2 M a ç a 004D 0061 00E7 0061
    70. 70. Novamente, assim não dá!
    71. 71. UTF-8
    72. 72. UTF-8Unicode Transformation Format
    73. 73. UTF-8 Unicode Transformation FormatEsse negócio de utilizar 2 bytes não vai rolar!
    74. 74. UTF-8 Unicode Transformation FormatEsse negócio de utilizar 2 bytes não vai rolar! Representação variável de 1 a 4 bytes.
    75. 75. UTF-8 Unicode Transformation Format Esse negócio de utilizar 2 bytes não vai rolar! Representação variável de 1 a 4 bytes.No UTF-8 os caracteres abaixo de 128 são armazenados em apenas 1 byte.
    76. 76. UTF-8 Unicode Transformation Format Esse negócio de utilizar 2 bytes não vai rolar! Representação variável de 1 a 4 bytes.No UTF-8 os caracteres abaixo de 128 são armazenados em apenas 1 byte. Compatível com o ASCII.
    77. 77. UTF-8 Unicode Transformation Format Esse negócio de utilizar 2 bytes não vai rolar! Representação variável de 1 a 4 bytes.No UTF-8 os caracteres abaixo de 128 são armazenados em apenas 1 byte. Compatível com o ASCII. Formado por octetos (8-bit), por isso UTF-8.
    78. 78. UTF-8Unicode Transformation Format
    79. 79. Imagine a palavra Maça M -> 4D a -> 61 ç -> E7 a -> 61Codificando com UTF-8 M a ç a 4D 61 C3 A7 61
    80. 80. Imagine a palavra Maça M -> 4D a -> 61 ç -> E7 a -> 61Codificando com UTF-8 M a ç a 4D 61 C3 A7 61
    81. 81. Classe String
    82. 82. Tipo char 2 bytes
    83. 83. Tipo char 2 bytesNão sinalizado
    84. 84. Tipo char 2 bytes Não sinalizadoArmazena valores de 0 até 65535
    85. 85. Tipo char 2 bytes Não sinalizado Armazena valores de 0 até 65535Representa um code point do Unicode
    86. 86. Exibindo os caracteres e seus respectivos code points
    87. 87. 1. public static void main(String args[]) {2. String texto = “Java Magazine”;3. for(char c : texto.toCharArray()) {4. System.out.print(c);5. System.out.print((int) c);6. }7. }Console:
    88. 88. 1. public static void main(String args[]) {2. String texto = “Java Magazine”;3. for(char c : texto.toCharArray()) {4. System.out.print(c);5. System.out.print((int) c);6. }7. }Console:J74a97v118a9732M77a97g103a97z122i105n110e101
    89. 89. 1. public static void main(String args[]) {2. String texto = “Java Magazine”;3. for(char c : texto.toCharArray()) {4. System.out.print(c);5. System.out.print((int) c);6. }7. }Console:J74a97v118a9732M77a97g103a97z122i105n110e101
    90. 90. Inicializando o tipo char
    91. 91. 1. public static void main(String args[]) {2. char a = ‘a’;3. char b = 97;4. char c = ‘u0061’;5. char d = 0x61;6. System.out.print(a);7. System.out.print(b);8. System.out.print(c);9. System.out.print(d);10. }Console:
    92. 92. 1. public static void main(String args[]) {2. char a = ‘a’;3. char b = 97;4. char c = ‘u0061’;5. char d = 0x61;6. System.out.print(a);7. System.out.print(b);8. System.out.print(c);9. System.out.print(d);10. }Console:aaaa
    93. 93. Codificando a classe String
    94. 94. ExemploCodificar a palavra “Maça” em ISO- 8859-1 e UTF-8
    95. 95. 1. public static void main(String args[]) {2. String texto = “Maça”;3. byte[] textoEmISO = texto.getBytes(“ISO-8859-1”);4. for(byte b : textoEmISO) {5. System.out.print(b + “ “);6. }7. }Console:
    96. 96. 1. public static void main(String args[]) {2. String texto = “Maça”;3. byte[] textoEmISO = texto.getBytes(“ISO-8859-1”);4. for(byte b : textoEmISO) {5. System.out.print(b + “ “);6. }7. }Console:
    97. 97. 1. public static void main(String args[]) {2. String texto = “Maça”;3. byte[] textoEmISO = texto.getBytes(“ISO-8859-1”);4. for(byte b : textoEmISO) {5. System.out.print(b + “ “);6. }7. }Console:77 97 -25 97
    98. 98. 1. public static void main(String args[]) {2. String texto = “Maça”;3. byte[] textoEmUTF = texto.getBytes(“UTF-8”);4. for(byte b : textoEmUTF) {5. System.out.print(b + “ “);6. }7. }Console:
    99. 99. 1. public static void main(String args[]) {2. String texto = “Maça”;3. byte[] textoEmUTF = texto.getBytes(“UTF-8”);4. for(byte b : textoEmUTF) {5. System.out.print(b + “ “);6. }7. }Console:
    100. 100. 1. public static void main(String args[]) {2. String texto = “Maça”;3. byte[] textoEmUTF = texto.getBytes(“UTF-8”);4. for(byte b : textoEmUTF) {5. System.out.print(b + “ “);6. }7. }Console:77 97 -61 -89 97
    101. 101. 1. public byte[] encodeUTF8(String value) {2. byte[] utf8 = new byte[bytesNeeded];3. // do the conversion from character code points to utf-84. for (int i = 0, bytes = 0; i < ch.length; i++) {5. if (ch[i] < 0x80) {6. utf8[bytes++] = (byte) ch[i];7. } else if (ch[i] < 0x0800) {8. utf8[bytes++] = (byte) (ch[i] >> 6 | 0xC0);9. utf8[bytes++] = (byte) (ch[i] & 0x3F | 0x80);10. } else if (ch[i] < 0x10000) {11. utf8[bytes++] = (byte) (ch[i] >> 12 | 0xE0);12. utf8[bytes++] = (byte) (ch[i] >> 6 & 0x3F | 0x80);13. utf8[bytes++] = (byte) (ch[i] & 0x3F | 0x80);14. } else {15. utf8[bytes++] = (byte) (ch[i] >> 18 | 0xF0);16. utf8[bytes++] = (byte) (ch[i] >> 12 & 0x3F | 0x80);17. utf8[bytes++] = (byte) (ch[i] >> 6 & 0x3F | 0x80);18. utf8[bytes++] = (byte) (ch[i] & 0x3F | 0x80);19. }20. }21. return utf8;22. }
    102. 102. Decodificando bytes
    103. 103. ExemploDecodificando os bytes da palavra “Maça” codificada em UTF-8 97 77 -61 -89 77
    104. 104. 1. public static void main(String args[]) {2. byte[] textoEmUTF = new byte[]{77,97,-61,-89,97};3. String texto = new String(textoEmUTF, “ISO-8859-1”);4. System.out.println(texto);5. }Console:
    105. 105. 1. public static void main(String args[]) {2. byte[] textoEmUTF = new byte[]{77,97,-61,-89,97};3. String texto = new String(textoEmUTF, “ISO-8859-1”);4. System.out.println(texto);5. }Console:
    106. 106. 1. public static void main(String args[]) {2. byte[] textoEmUTF = new byte[]{77,97,-61,-89,97};3. String texto = new String(textoEmUTF, “ISO-8859-1”);4. System.out.println(texto);5. }Console:Maça
    107. 107. De onde vem os bytes?
    108. 108. InputStream e OutputStream
    109. 109. ExemploLendo o conteúdo de um arquivo texto
    110. 110. 1. public static void main(String args[]) {2. InputStream input = new FileInputStream(“file.txt”);3. byte[] conteudo = new byte[input.available()];4. input.read(conteudo);5. String texto = new String(conteudo, “ISO-8859-1”);6. System.out.println(texto);7. }
    111. 111. 1. public static void main(String args[]) {2. InputStream input = new FileInputStream(“file.txt”);3. byte[] conteudo = new byte[input.available()];4. input.read(conteudo);5. String texto = new String(conteudo, “ISO-8859-1”);6. System.out.println(texto);7. }
    112. 112. Como saber o sistema de codificação correto?
    113. 113. ExemploConsultando uma página web por meio do protocolo HTTP
    114. 114. 1. public static void main(String args[]) {2. String url = “http://www.javamagazine.com.br”;3. InputStream input = new URL(url).openStream();4. byte[] conteudo = new byte[input.available()];5. input.read(conteudo);6. String html = new String(conteudo, “ISO-8859-1”);7. System.out.println(html);8. }Console:<html><head><title>DevMedia - Canal Java</title><link rel="canonical" href="http://www.devmedia.com.br/java/" /><link rel="shortcut icon" href="/favicon.ico"><meta http-equiv="refresh" content="300"><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">...
    115. 115. 1. public static void main(String args[]) {2. String url = “http://www.javamagazine.com.br”;3. InputStream input = new URL(url).openStream();4. byte[] conteudo = new byte[input.available()];5. input.read(conteudo);6. String html = new String(conteudo, “ISO-8859-1”);7. System.out.println(html);8. }Console:<html><head><title>DevMedia - Canal Java</title><link rel="canonical" href="http://www.devmedia.com.br/java/" /><link rel="shortcut icon" href="/favicon.ico"><meta http-equiv="refresh" content="300"><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">...
    116. 116. Como descobrir o sistema de codificação correto?
    117. 117. Problemas de Charset na Web
    118. 118. HTTP RequestGET /javamagazine/ HTTP/1.1Host: www.devmedia.com.brUser-Agent: Mozilla/5.0 Gecko/20100101 Firefox/14.0.1Accept: text/htmlAccept-Language: pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding: gzip, deflate
    119. 119. HTTP ResponseHTTP/1.1 200 OKContent-Type: text/html;charset=ISO-8859-1;Content-Encoding: gzipServer: Microsoft-IIS/7.5X-Powered-By: ASP.NETDate: Wed, 15 Aug 2012 03:30:07 GMT
    120. 120. HTTP ResponseHTTP/1.1 200 OKContent-Type: text/html;charset=ISO-8859-1;Content-Encoding: gzipServer: Microsoft-IIS/7.5X-Powered-By: ASP.NETDate: Wed, 15 Aug 2012 03:30:07 GMT
    121. 121. Simulando problemas
    122. 122. 1. @WebServlet(“/javamagazine”)2. public class EnsaioServlet extends HttpServlet {3. protected void doGet(HttpServletRequest req, HttpServletResponse res) {4. String texto = “Maça”;5. OutputStream output = response.getOutputStream();6. for(byte b : texto.getBytes(“ISO-8859-1”) {7. output.write(b);8. }9. output.close();10. }11. }
    123. 123. HTTP ResponseHTTP/1.1 200 OKServer: Apache-Coyote/1.1Content-Length: 4Date: Sat, 18 Aug 2012 13:49:35 GMT
    124. 124. Cada browser assume um sistema de codificação padrão
    125. 125. Definindo o charset no HTTP Response
    126. 126. 1. @WebServlet(“/javamagazine”)2. public class EnsaioServlet extends HttpServlet {3. protected void doGet(HttpServletRequest req, HttpServletResponse res) {4. String texto = “Maça”;5. OutputStream output = response.getOutputStream();6. for(byte b : texto.getBytes(“ISO-8859-1”) {7. output.write(b);8. }9. output.close();10. }11. }
    127. 127. 1. @WebServlet(“/javamagazine”)2. public class EnsaioServlet extends HttpServlet {3. protected void doGet(HttpServletRequest req, HttpServletResponse res) {4. String texto = “Maça”;5.6. OutputStream output = response.getOutputStream();7. for(byte b : texto.getBytes(“ISO-8859-1”) {8. output.write(b);9. }10. output.close();11. }12. }
    128. 128. 1. @WebServlet(“/javamagazine”)2. public class EnsaioServlet extends HttpServlet {3. protected void doGet(HttpServletRequest req, HttpServletResponse res) {4. String texto = “Maça”;5. res.setContentType(“text/html;charset=ISO-8859-1”);6. OutputStream output = response.getOutputStream();7. for(byte b : texto.getBytes(“ISO-8859-1”) {8. output.write(b);9. }10. output.close();11. }12. }
    129. 129. Declarando a tag META no documento HTML
    130. 130. <HTML><HEAD><META http-equiv =“Content-Type”content=“text/html;charset=ISO-8859-1”></HEAD><BODY>...</BODY></HTML>
    131. 131. Ordem de prioridade dada pelos browsers1. Charset definido na propriedade Content-Type do cabeçalho do HTTP Response2. Declaração da tag META com o atributo “http-equiv” no head do documento HTML3. O atributo charset definido em elementos de importação de recursos externos como Javascript.
    132. 132. Cuidado com a compilação dos arquivos fonte
    133. 133. 1. public class TesteCompilacao {2. public static void main(String[] args) {3. String texto = “Maça”;4. System.out.println(texto);5. }6. }
    134. 134. 1. public class TesteCompilacao {2. public static void main(String[] args) {3. String texto = “Maça”;4. System.out.println(texto);5. }6. }Console:javac TesteCompilacao.java –encoding ISO-8859-1java TesteCompilacaoMaça
    135. 135. Cuidado com sistemas de codificaçãoespecíficos como MacRoman e Cp1252!
    136. 136. Dicas para evitar problemas de codificação• Defina um padrão na equipe• Evite sistemas de codificação específicos de um sistema operacional• Prefira o UTF-8• Fique atento a compilação• Sempre defina o Content-Type• Declare a tag META http-equiv• Externalize as String’s• Evite resolver os problemas na base da tentativa e erro
    137. 137. Obrigado!www.slideshare.net/rodrigobranas

    ×