Rafael Benevides bio photo

Rafael Benevides

In a serious relationship with Software Development

Email Twitter Facebook Google+ LinkedIn Instagram Github Last.fm Youtube

Uma das primeiras ações que tomei ao iniciar minhas atividades no INEP foi definir o Charset padrão para UTF-8. Para garantir que todos os fontes (java e html) estejam utilizando o charset definido, alterei o pre-commit hook do Subversion para que faça uma checagem da codificação dos arquivos antes de efetivar o commit.

Obviamente fui questionado por N desenvolvedores, qual a real intenção por traz daquele ato. Já trabalhei em alguns lugares onde alguns desenvolvedores utilizavam Windows e outros Linux no seus Desktops. Cada um destes SOs usam um charset padrão diferente para salvar seus arquivos (ISO-8859-1 e UTF-8 respectivamente). Portanto era comum termos algumas mensagens de exceptions sendo mostradas com alguns erros nas acentuações e caracteres especiais.

Mesmo no INEP em conversa com o Demetrio, um excelente Web-Designer, tivemos algumas várias horas de conversa sobre qual a função do charset e da utilidade da tag Content-Type do html. Com o intuito de desmistificar este assunto, fica aqui a a referência a um excelente artigo do Joel On Software, escrito em outubro de 2003, onde ele mesmo diz: “Se você é um programador trabalhando em 2003 e não sabe o básico de character encoding e Unicode, vou pega-lo, e puni-lo, fazendo-o picar cebolas por 6 meses em um submarino”. E ainda mais: "Acreditar que “plain text = ascii = caracteres são 8 bits não só é errado, mas se continua programando desta maneira, você não é muito melhor do que um médico que não acredita em germes. Por favor, não escreva outra linha de código sem ler este artigo”

The Single Most Important Fact About Encodings – It does not make sense to have a string without knowing what encoding it uses.

“Se você possui uma string, em memória, em arquivo, ou em um e-mail, você precisa saber qual o encoding está ou você não será capaz de interpretar ou mostrar tal string corretamente.”

Isto permite que sites sejam perfeitamente visualizados em Japonês, em Árabe ou até mesmo em Russo.

Faça um teste! Cada um destes sites estão usando um Content-Type difente. Você pode se informar sobre qual o Charset utilizado clicando CTRL+I no Firefox. Experimente mudar a forma como o browser interpreta os caracteres mudando a codificação no menu Exibir→Codificação do Firefox.

Percebam que isto não tem nada haver com o Locale (Content-Language) que é o idioma da página.

Por quê então foi escolhido o UTF-8 como charset padrão do INEP e não o ISO-8859-1? Existem várias discussões na Internet sobre isto, mas a principal é que o UTF-8 é um formato universal e creio que abra em todos os sistemas e dispositivos de forma correta e sem bugs. Outro fato é que a própria w3c cita: “A Unicode encoding such as UTF-8 is a good choice for a number of reasons.” e também cita em outra página (em português): “Os exemplos acima mostram declarações para codificação de conteúdos em UTF-8. Esta parece ser a melhor escolha para a maioria dos propósitos dos documentos, contudo não é a única possibilidade.”

Voltando ao assunto do pre-commit hook, se tiver interesse em implementa-lo em seus repositórios do Subversion, dê uma olhada aqui: http://svnbook.red-bean.com/nightly/en/svn.reposadmin.create.html

Para verificar se o arquivo é UTF-8, basta alterar este script que já vem no Subversion para verificar outras extensões e não apenas arquivos *.po

Em códigos fontes já existentes, o Claúdio Miranda postou em seu blog, duas excelentes alternativas para conversão:

  1. Conversão de charset para UTF-8
  2. Conversão de charset para UTF-8, modo gráfico

Boa leitura!