Neste artigo, apresentaremos desde os primórdios do código Morse e da tabela ASCII, até o nascimento do padrão Unicode, para explicar como funcionam os sistemas de codificação e seus principais problemas dentro da plataforma Java.
Em que situação o tema é útil:
Quem ainda não teve problemas de codificação certamente um dia terá. Com base nisso, este artigo visa auxiliar na redução do sofrimento causado por este tipo de problema e ainda diminuir o tempo gasto com soluções baseadas em tentativa e erro.
Desvendando os mistérios do Charset:
Este artigo tem como objetivo chamar a atenção para um tema complicado e que a maior parte dos desenvolvedores acaba dando pouca importância no dia a dia. Para isso vamos apresentar as origens dos sistemas de codificação e uma série de dicas para ajudar a resolver problemas e evitar dores de cabeça no futuro.
Quem nunca passou vergonha na hora de apresentar um software recém-implementado e se surpreendeu com caracteres estranhos, e até 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. Entretanto, tentar resolvê-lo 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.
Neste artigo, vamos a fundo às raízes do problema, apresentando 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 caracteres nas profundezas do Java.
Tudo começou com o Código Morse
Em 1836, Samuel F. B. Morse, Joseph Henry e Alfred Vail desenvolveram um importante meio de comunicação, baseado na transmissão de pulsos elétricos, conhecido como telégrafo. Na época, o sistema de codificação utilizado para transmitir mensagens de maneira rápida e confiável era o código Morse. Este consistia na representação das letras do alfabeto e números por meio de pulsos elétricos longos e curtos, como pode ser visto na Figura 1.
Figura 1. Código Morse com seus pulsos longos e curtos.
Em suas primeiras versões, o código Morse não contava com letras minúsculas, acentuadas ou mesmo sinais de pontuação, e foi sendo estendido ao longo do tempo conforme se estabeleciam comunicações entre diferentes idiomas. Muitos anos mais tarde, o mesmo processo de evolução ocorrido com o código Morse foi acontecendo com os sistemas de codificação dos computadores, que veremos a seguir.
Entendendo os sistemas de codificação de caracteres
Um sistema de codificação de caracteres, ou character encoding, consiste em uma forma de associar um determinado conjunto de letras, números e símbolos, a um tipo de representação – números binários, hexadecimais ou mesmo pulsos elétricos – com o objetivo de facilitar a transmissão e o armazenamento dos dados.
Em 1963, a American Standards Association criou uma tabela de codificação de caracteres chamada ASCII, com o objetivo de padronizar o sistema de codificação utilizado na época, quando era comum que cada fabricante criasse seus próprios sistemas, o que causava incompatibilidade entre diferentes plataformas.
Essa tabela utilizava um conjunto de 7 bits para representar 128 caracteres, o que era suficiente para exibir todas as palavras e símbolos mais utilizados em textos escritos na língua inglesa. Entretanto, para os idiomas latinos, que em geral possuem muitas palavras acentuadas, além de outros tipos de pontuação, o ASCII não era suficiente. Por esse motivo, a ISO (International Standards Organization) criou várias extensões (norma 8859) baseadas na tabela ASCII, com 8 bits, para suprir as necessidades de diversos países e idiomas.
Ao todo, existem cerca de 16 variações da codificação ISO-8859, onde uma das mais utilizadas é a ISO-8859-1, ou Latin-1, adotada em boa parte da Europa, África e, principalmente nas Américas, por dar suporte completo aos idiomas português, espanhol, alemão, italiano e inglês.
O nascimento do padrão Unicode
O Unicode foi criado no fim da década de 80 por Joe Becker da Xerox e Lee Collins da Apple com o objetivo de ser um padrão de codificação de caracteres mundialmente aceito e que fosse capaz de resolver o problema de incompatibilidade entre os diferentes sistemas de codificação de caracteres utilizados na época.
Somente o idioma japonês possui três sistemas de escrita: Hiragana, Katakana e Kanji. Este último é formado por cerca de 40 mil kanjis, ou ideogramas, que representam ideias, conceitos e que podem ter mais de um significado. Conjuntos de caracteres complexos como este não poderiam ser representados pelos apenas 8 bits dos sistemas de codificação mais tradicionais, como os da norma ISO-8859.
...