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.
3. @rodrigobranas
rodrigo.branas@gmail.com
http://www.agilecode.com.br
Formação Acadêmica
Ciências da Computação – UFSC
Gerenciamento de Projetos - FGV
Certificações
SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
4. Rodrigo Branas – rodrigo.branas@gmail.com
10 anos de experiência na plataforma Java
1000 horas em sala de aula
Mais de 50 palestras em eventos
Líder da área de desenvolvimento na Gennera
Autor da revista Java Magazine
Palestrante
Instrutor da Academia Java e Agile da Globalcode
Criador dos treinamentos de Clean Code, Selenium e
Maven da Agile Code
Trabalhou com as empresas: EDS, HP, GM, Citibank,
OnCast, Globalcode, V.Office, Dígitro, Softplan, Unimed,
Suntech, Vale do Rio Doce, Senai, NET.
5.
6.
7.
8. Qual é a forma mais comum de
resolver esse tipo de problema?
33. ASCII
American Standard Code for Information Interchange
Publicado em 1963
7 bits ou 128 caracteres
32 caracteres não imprimíveis (00 ~ 1F)
34. ASCII
American 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)
35. ASCII
American 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)
36. ASCII
American 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
45. Norma ISO 8859
International Standard Organization
Conjunto de sistemas de codificação de 8 bits
46. Norma ISO 8859
International Standard Organization
Conjunto de sistemas de codificação de 8 bits
Regionalizado (16 tipos)
47. Norma ISO 8859
International Standard Organization
Conjunto de sistemas de codificação de 8 bits
Regionalizado (16 tipos)
96 novos caracteres! (Agora vai)
48. 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
49. 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
51. 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.
52. ISO-8859-2
Latin-2 Central Europa
Menos utilizado!
Bósnio, Polonês, Croata, Tcheco, Eslovaco, Esloveno, Sér
vio e Húngaro.
53. ISO-8859-3
Latin-3 South Europe
Menos utilizado!
Turco, Maltês e Esperanto.
54. ISO-8859-4
Latin-4 North Europe
Menos utilizado!
Difícil até de pronunciar...
55. ISO-8859-5 Latin/Cyrillic
ISO-8859-6 Latin/Arabic
ISO-8859-7 Latin/Greek
ISO-8859-8 Latin/Hebrew
ISO-8859-9 Latin-5 Turkish
ISO-8859-10 Latin-6 Nordic
ISO-8859-11 Latin Thai
ISO-8859-12 Latin Devanagari
ISO-8859-13 Latin Baltic Rim
ISO-8859-14 Latin Celtic
ISO-8859-15 Latin-9 (Francês completo)
ISO-8859-16 Latin-10 South-Eastern European
59. 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
64. Unicode
Universal Character Set
Publicado em 1991
Acabar com as limitações dos sistemas de caracteres
(principalmente os pertencentes a norma ISO 8859)
65. 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
66. 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
67. 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)
68. 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
81. UTF-8
Unicode Transformation Format
Esse negócio de utilizar 2 bytes não vai rolar!
82. 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.
83. 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.
84. 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.
85. 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.
145. Ordem de prioridade dada pelos
browsers
1. Charset definido na propriedade Content-Type do
cabeçalho do HTTP Response
2. Declaração da tag META com o atributo “http-equiv” no
head do documento HTML
3. O atributo charset definido em elementos de importação
de recursos externos como Javascript.
151. 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
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.