quarta-feira, 10 de setembro de 2008

Porque usar UTF-8

Olá, estou inaugurando esse meu novo blog hoje, esse blog será dedicado a desenvolvimento em geral, irei postar aqui coisas que já aprendi ao longo da minha vida de desenvolvedor e coisas que ainda aprendo (afinal, nesse mundo nós nunca paramos de aprender).

Hoje eu quero falar sobre um assunto do qual acredito que a maioria já deva ter passado, que é o clássico problema de encoding. Muitas pessoas apenas saem usando o encoding que funcionar na hora, mas na verdade não fazem a menor ideia do que os encodings são e muito menos porque eles existem (e pensam, por que simplesmente não adoptam apenas um encoding para acabar com essa pu*****), nesse artigo pretendo explicar o que são os encodings, porque existem, como funcionam, e como diz o título do artigo, porque devemos utilizar UTF-8. Agora chega de enrrolação e vamos ao que interessa :)

Como tudo começou

Para entendermos esse assunto que pode ser um tanto complicado, vamos começar do começo realmente, por que existem tantos formatos de encoding (que diga-se de passagem, normalmente nós brasileiros só lidamos com dois...).

Vamos voltar no tempo e lembrar dos computadores primórdios, naqueles tempos os computadores nem se imaginavam com letras, eles eram utilizados apenas para operações numéricas, então nem existiam caracteres, oque dizer então de processos de encoding.

O padrão ASCII

Muitos já devem no mínimo ter lido em algum lugar a sigla ASCII (American Standard Code for Information Interchange), pois é, o ASCII é um padrão americano para troca de mensagens (para textos) e esse padrão utiliza 7 bits para armazenar cada caractere, então, isso significa que ele suporta até 128 caracteres (que é o máximo número possível de se armazenar em 7 bits). Então essa é uma forma antiga de se conseguir reproduzir textos no computador, pois assim nós temos um mapeamento dos números com os caracteres. Dentro desses 128 caracteres do padrão ASCII, 33 não não imprimíveis, ou seja, caracteres de comando, e os outros 94 são imprimíveis (excepto o espaço), ou seja, são realmente coisas para aparecer na tela.

Para os americanos esse padrão da conta, mas como sabemos a informática cresceu, e esse padrão não dava conta de caracteres de outros locais como nossos acentos latinos por exemplo... Várias soluções devem ter sido tentadas para solucionar esse problema, mas eu sinceramente não tenho tanto conhecimento sobre esse meio tempo, então já irei pular para algo concreto que aconteceu.

Padrões ISO

Os mais entendidos já devem ter percebido algo estranho, o padrão ASCII usa 7 bits para representar os caracteres, mas a menor unidade que o computador trabalha é 1 byte (ou seja, 8 bits), então temos ai um bit sobrando em cada caractere que usamos, e se fizermos uso desse bit podemos duplicar a capacidade de 128 para 256 caracteres por byte, e é nesse ponto que entram os padrões ISO.

De certa forma todos os lugares do mundo usam os caracteres americanos, então eles se mantiveram estáticos nos seus 128 bits como já estavam antes, mas agora vinha o problema do que fazer com os outros 128 que agora seriam utilizados, é lógico que 128 caracteres a mais não são suficientes para comparar todos os caracteres do mundo, então foram criadas várias tabelas ISO, onde cada uma mapeava os 128 bits restantes para certa localidade, nós pode exemplo utilizamos muito o padrão ISO-8859-1 (caracteres latinos). Dessa forma temos um padrões para representar quaisquer caracteres do mundo, mantendo o padrão de 1 byte por caractere.

Então parece que as coisas estão ficando boas, mas resta um problema...

Caracteres de várias localidades juntos

Bom, como vimos ate o momento, e possível usar qualquer tipo de caractere se você estiver com o encoding correto, mas e se você tiver um site internacional, onde você precisa utilizar mais de um idioma ao mesmo tempo?

Para nos salvar então existem as codificações UTF (Unicode Transformation Format) onde e possível utilizar os caracteres diretamente a partir do seu código Unicode. Mas espera ai, o escopo dos códigos Unicode e imenso, seria um abuso gastar tantos bytes com cada caractere para podermos comportar os maiores... E por isso que o UTF existe, ele na verdade e um padrão de codificação de caracteres, existem vários algoritmos diferentes de UTF (UTF-1, UTF-7, UTF-8, UTF-16 e UTF-32), vou me reter nesse artigo ao mais utilizado, o UTF-8.

UTF-8

O UTF-8 utiliza um modo de codificação onde os caracteres tem tamanho variável (podem variar entre 1 e 4 bytes), ele usa um modelo nos bytes para que seja possível descobrir quantos bytes o caractere atual estará utilizando. Com a codificação UTF-8 temos acesso a um alcance da tabela unicode entre os caracteres de código U+0000 ate U+10FFFF, que são todos os caracteres formais da tabela Unicode, e garanto a vocês, é tudo que precisam, heheh.

Outro detalhe interessante do padrão UTF-8 e que ele é compatível com o padrão ASCII, então os caracteres entre 0 e 127 são escritos em UTF-8 de forma exatamente igual ao formato ASCII, dessa forma eles são compatíveis.

No próximo artigo estarei postando em detalhes como funciona a codificação do UTF-8, assim como criaremos um script conversor utilizando Javascript (ninguém tem desculpa pra dizer que não tem como usar, hehehe).

Resumo

Como pudemos ver o UTF-8 e uma evolução, e com a banda que temos hoje em dia o que ele aumenta no tamanho do texto e insignificante, sinceramente não existe motivo para utilizar os velhos padrões ISO, porque mesmo que hoje você não use caracteres fora do latino (e olha que usa, um bom exemplo são aquelas aspas que o word adora colocar, que não são aspas comuns e não estão disponíveis nos caracteres latinos, e pior, seus clientes adoram copiar texto do word) você ira poupar muitas dores de cabeça.

Esperam que tenham gostado do meu primeiro artigo nesse blog, estarei postando muitas coisas dos mais variados assuntos no ramo do desenvolvimento daqui para frente.

Grato a sua atenção, e até a próxima.