ASCII e CP-437
Os primeiros computadores foram projetados somente para usuários da língua inglesa. De acordo com [1] o alfabeto inglês, possui 26 letras. Considerando que o computador diferencia letras maiúsculas de minúsculas, então, são necessários 52 símbolos para representar todas as letras, 10 símbolos para os números indo-arábicos e outro tanto para caracteres como símbolos gráficos, símbolos de pontuação, símbolos matemáticos e símbolos de controle (não imprimíveis).
Todavia, o computador somente entende números binários (0 e 1). Deste modo, é necessário relacionar um número binário com a representação gráfica de um caractere formando uma tabela de símbolos. Esse tipo de tabela recebe o nome de página de código (code page).
A primeira iniciativa para padronizar uma página de código foi feita pela indústria telegráfica americana e foi chamada de codificação ASCII - American Standard Code for Information Interchange - Código Americano Para Intercâmbio de Informações. A primeira versão da tabela ASCII utilizava codificação base 2 com sete dígitos (2 ^ 7 = 128 caracteres binários). Por exemplo, o código ASCII binário para a letra "A" (maiúscula) com sete dígitos é representado como 1000001.
A tabela ASCII foi estendida com a codificação base 2, agora em oito dígitos. O conjunto de oito bits recebeu o nome de byte. O código para a letra "A" (maiúscula) de um byte é 01000001. No sistema decimal, o zero à esquerda não representa nada. Entretanto, no sistema binário, ao acrescentar um digito à esquerda, aumentamos exponencialmente a capacidade de representação do número binário. Um binário com oito dígitos pode representar 256 caracteres, pois 2 ^ 8 = 256. Os processadores Intel 8008, Motorola 6800 e Zilog Z80, são todos chips com arquitetura de 8 bits utilizados na construção dos primeiros computadores pessoais.
Observe que nem todos os caracteres da tabela ASCII são imprimíveis. Em função de sua origem telegráfica, os primeiros 32 caracteres (00h até 1Fh) da tabela ASCII foram reservados para códigos de controle utilizados na comunicação telegráfica. Os códigos de controle também são utilizados no computador eletrônico.
O espaço em branco é um caractere imprimível, apesar de não possuir um símbolo gráfico. A tabela ASCII possui apenas as letras do alfabeto inglês, sendo [a-z] para minúsculas, [A-Z] para maiúsculas, números indo-arábicos [0-9], caracteres de pontuação ( ! , . : ; ?), símbolos gráficos (@ # $ % & ( ) - [ ] { } / \) e símbolos matemáticos básicos ( - + * /).
A página de código CP-437 da IBM (chamada de MS-DOS Latin) foi uma das primeiras tentativas de internacionalização, como afirma [3]. Essa página de código internacional utilizava o alfabeto latino inglês, adicionado a uma série de caracteres acentuados utilizados nos principais países da Europa ocidental.
Podemos destacar os seguintes caracteres acentuados da página CP-437:
- Do espanhol (Á, Í, Ó, Ú).
- Do francês (À, Â, È, Ê, Ë, Ì, Î, Ï, Ô, , , Ù, Û).
- Do português (Á, À, Â, Ã, ã, Ê, Í, Ó, Ô, Õ, õ, Ú).
A internacionalização se deu dentro de um contexto de forte globalização e de neoliberalismo presente nos anos 1980-90. Não havia consenso na indústria de computação e cada fabricante adotava seu próprio padrão de página de código. Isso levou a uma verdadeira torre de babel com o uso de padrões proprietários e padrões abertos que não se comunicavam ou se comunicavam com muita dificuldade.
ISO-8859-n, ANSI e Windows-1252
A maior tentativa de normatizar o processo de internacionalização, foi idealizada pelo consórcio ISO/IEC e recebeu o nome de padrão ISO-8859-N. Esse padrão gerou uma série de páginas de código em oito bits. À medida que a indústria da computação avançava sobre a Europa oriental (devido a queda do muro de Berlim, em 1989), surgia a necessidade de atualizar as páginas de código.
Observando o quadro encontrado em [4], é possível obter uma relação de países e suas respectivas páginas de código. O padrão ISO-8859-N possui uma página de código para cada alfabeto com caracteres comuns em vários países.
Por exemplo, ISO-8859-1 (chamado também de Latin 1) é a página de código padrão para países que falam as seguintes línguas: dinamarquês, holandês, finlandês, francês, alemão, islandês, irlandês, italiano, norueguês, português, espanhol, catalão e sueco (falado na Finlândia por Linus Torvalds).
No total, foram definidas 16 páginas de código (ISO-8859-1 até 8859-16) que possuem em comum o fato de serem todas codificadas em 8 bits e terem os caracteres do alfabeto latino. Outra curiosidade sobre o ISO-8859-1, é que esse é o conjunto definido para ser utilizado por uma invenção recente da época:
World Wide Web. ISO-8859 também é usado como um dos padrões para codificação de tipos MIME ainda hoje.
Para variar, a Microsoft adotou um "padrão proprietário" criando um super conjunto semelhante ao ISO-8859-n chamado de Windows-1252, chamado também de código ANSI. Os sistemas Windows-1252 e ISO-8859, apesar de semelhantes, têm muitas diferenças técnicas e não se comunicam facilmente.
Em meados da década de 1990, depois que a Europa estava dominada pela indústria americana da computação, os esforços de internacionalização se voltaram para o oriente. Os mercados do Japão, da Coréia e da China passaram a ser o maior objetivo comercial dessas empresas em função de seu tamanho e poder de compra.
A questão sobre a internacionalização em países asiáticos, é que eles não utilizam caracteres latinos, como na maior parte do ocidente. Os países asiáticos, de modo geral, utilizam um conjunto de símbolos gráficos para representar palavras, nomes, conceitos e ideias. Por exemplo, o Kanji (hanzi) é a escrita formal japonesa e possui aproximadamente 4.000 símbolos. Nesse tipo de escrita, um símbolo pode representar um ou mais conceitos ou pode ter mais de um símbolo para o mesmo conceito. Assim, na escrita do oriente não encontramos o conceito de letras ou sílabas como conhecemos no ocidente.
Além disso, existe a questão da direção da leitura. Nas línguas latinas, em geral, a leitura é feita da esquerda para a direita e de cima para baixo. Em línguas orientais encontramos também a leitura da direita para a esquerda, e em alguns casos, de baixo para cima. Podendo haver até mesmo uma variação em ambas as direções ao mesmo tempo dentro do mesmo texto (raro).
No oriente são utilizados ideogramas (conceito semelhante ao da escrita egípcia) e os logogramas (símbolos gráficos) que juntos somam milhares de símbolos gráficos. Essa quantidade enorme de caracteres não pode ser representada em uma página de código de 8 bits.
A solução foi representar os caracteres orientais em um sistema com 16 bits ou dois bytes - 2 ^ 16 = 65.536 caracteres. Dois bytes formando um único caractere é um tipo computacional chamado Word.
As codificações ISO-8859 e Windows-1252 tiveram seu mérito. Entretanto, o péssimo suporte para caracteres orientais e o fato de que sistemas proprietários são incompatíveis com sistemas abertos, acabaram levando a uma nova tentativa de internacionalização.
Unicode e UTF-8
O consórcio Unicode é uma entidade sem fins lucrativos que coordena o desenvolvimento de uma página de código universal. Essa super página de códigos terá os símbolos de todos os alfabetos existentes, atuais ou extintos, desde de que tenham relevância para a comunidade científica. Unicode pretende substituir todos os sistemas de páginas de código existentes no mundo e se tornar o único sistema utilizado para esse fim.
Na prática, isso significa que a página de código Unicode teria mais de 110 mil símbolos no total. Isso inclui alfabetos atuais, de escritas extintas, de línguas indígenas, de antigos alfabetos de sinais como hieróglifos egípcios, runas inglesas e até a escrita cuneiforme dos sumérios. Além disso, são incluídos todos os sinais matemáticos e os símbolos musicais utilizados para escrever partituras e muitos outros símbolos e gráficos estranhos ou raros.
Obviamente, a iniciativa é um exagero desmedido, já que a maioria das pessoas utiliza apenas o alfabeto de sua própria língua. Poucas pessoas escrevem textos multilíngues e, quando o fazem, usam de duas até quatro línguas normalmente similares. Manter milhares de caracteres em memória para uso eventual, não é viável em termos de computação. O padrão Unicode é uma daquelas boas ideias que na teoria são ótimas, mas na prática não dão certo.
Assim, surgiu a ideia de implementar um sistema compatível com Unicode, mas que usasse apenas os caracteres necessários. Esse sistema foi chamado de UTF - Unicode Transformation Format. UTF é um método utilizado para implementar Unicode usando menos recursos de memória e disco. Existem várias versões de UTF como UTF-8, UTF-16 e UTF-32. No momento, a que tem maior suporte e permite melhor uso é UTF-8.
UTF-8 é flexível e utiliza de um até quatro bytes para representar um caractere. Em Unicode, os caracteres são sempre representados como U+0000, onde um 0 representa um byte. Se utilizarmos apenas um byte podemos representar até 256 caracteres como no sistema ASCII. Por exemplo, de U+0000 até U+007F podemos representar os 128 caracteres do ASCII legado e de (U+0080 até U+00FF podemos representar os 128 caracteres do ASCII estendido).
Na prática, os caracteres ocidentais e orientais podem ser representados com dois bytes apenas já que 2 ^ 16 = 65.536 símbolos. Os problemas são alguns símbolos que utilizam três ou até quatro bytes, tornando UTF-8 tão complexo quanto o próprio Unicode. A migração dos sistemas ANSI e ISO-8859-N para UTF-8 não está completa e alguns programas podem apresentar sérios problemas durante a migração (principalmente bancos de dados). Apesar disso, parece que UTF-8 será o padrão de codificação de caracteres em vários sistemas operacionais dentro de pouco tempo.