Por que utilizar utf-8?

Tags: , , — December 14, 2010 @ 8:21 pm

Um problema comum que vejo se repetindo constantemente em listas de discussão é devido a codificação de caracteres em páginas web.

Geralmente os desenvolvedores, inexperientes, solicitam ajuda por terem problemas que fazer caracteres acentuados aparecerem corrompidos, como “çã” e acabam adotando soluções pouco robustas, como editar o httpd.conf (no caso de um servidor web Apache) ou usar funções utf8_encode/utf8_decode (no caso de programação PHP).

Acontece que tais problemas ocorrem por causa de divergências na codificação de caracteres e é mais comum em ambientes Windows, que utilizam a codificação defasada ISO-8859-1 (ou latin-1, como também é chamada).

O modo de evitar este tipo de problema, é desenvolver toda a sua aplicação utilizando uma única codificação de caracteres, desde a base de dados até o HTML exibido para o usuário, e também em seu editor de texto ou IDE. Para garantir isto, por exemplo, em uma aplicação web, desenvolvida com PHP + MySQL, rodando em um servidor Apache2 e utilizando utf-8, atente para os seguintes detalhes:

  1. No arquivo de configuração do Apache (geralmente httpd.conf, mas podendo variar de um sistema para outro, no Debian GNU/Linux, o padrão é /etc/apache2/apache2.conf) comente a linha com a diretiva AddDefaultCharset. Como vamos definir a codificação a nível de aplicação, esta diretiva não irá interferir, mas mesmo assim o ideal é deixá-la comentada para evitar surpresas ao colocar a aplicação em produção.
  2. O PHP também tem uma diretiva para definir a codificação padrão, geralmente desabilitada por padrão, no arquivo php.ini (no Debian, em /etc/php5/apache2/php.ini) localize e comente a linha com a diretiva default_charset. Assim como no Apache, tal diretiva não deve interferir, mas ainda assim é ideal deixá-la comentada.
  3. Garanta que seu template HTML contenha a codificação correta definida no cabeçalho, utilizando uma tag meta (<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />). Para documentos XHTML, também é ideal adicionar a codificação no cabeçalho XML (<?xml version=”1.0″ encoding=”UTF-8″ ?>), obviamente esta regra também se aplica para documentos XML.
  4. Seu script principal da aplicação, ou seja, aquele que recebe as requisições, geralmente index.php, deve enviar um cabeçalho http com a codificação para o navegador antes de qualquer conteúdo. Ex: header(“Content-type: text/html; charset=UTF-8″);.
  5. Suas tabelas do MySQL devem ser criadas com a codificação definida explicitamente. Ex: CREATE TABLE foo (…) CHARACTER SET utf8. No MySQL também é possível definir a codificação de caracteres a nível de coluna ou de base de dados, mas a primeira dificilmente será necessária, e eu acho mais usual definir a codificação a nível de tabelas.
  6. Seu editor de texto ou IDE deve estar configurado para salvar arquivos em utf-8. No Eclipse, por exemplo, basta configurar sua Workspace (Window -> Preferences -> General -> Workspace), ou seu projeto (Clique direito -> Properties -> Resource) para utilizar a codificação desejada.

Para ser sincero, em geral apenas os ítens 4 e 6 são suficientes para garantir que sua aplicação exiba textos na codificação correta, mas ainda assim vale a pena configurar cada parte dela.

Alguns desenvolvedores web mais antigos, ou pouco experientes podem acabar sugerindo que se utilize htmlentities para caracteres acentuados, como “&acute” para escrever um “á”. Contudo esta prática é pouco viável para páginas dinâmicas, devido ao tamanho das strings. Por exemplo, nosso simples “á”, utilizando htmlentities, não poderia ocupar um campo char(1), em sua base de dados, precisando de um char(6), além de ser bem mais conteúdo para o navegador carregar ao visitar a página.

Agora a pergunta: Por que utilizar utf-8 ao invés de iso-8859-1?

Bem, existem alguns bons motivos técnicos… Para começar, utf-8 é compatível com caracteres ASCII, então para este não é necessária nenhuma conversão. Também, os caracteres unicode (utf8, utf16 e utf32) foram desenvolvidos inicialmente para substituir ASCII e ISO, então é natural que sejam utilizados no lugar destes. Para finalizar, algumas bibliotecas do PHP, e também de outras linguagens, só funcionam com codificação utf-8, tais como json, simpleXML e Soap, assim, utilizando a aplicação toda em utf-8 você evita converter constantemente caracteres de/para a codificação desejada.

Fontes: http://www.cl.cam.ac.uk/~mgk25/unicode.html, http://wilker-dev.com/porque-usar-utf-8-codificandodecodificando

If you enjoyed this post, make sure you subscribe to my RSS feed!

5 Comments »

  1. iae, mas cara, no meu caso aqui, tenho um site simples que eu altero para charset Iso pq se deixo o utf8 nao da certo. Eu nao tenho acesso ao arquivo php.ini do meu servidor web, se eu deixar o charset utf-8 vai ferra com as acentuações na hora q eu joga ele via ftp no ar.

    Comment by Luciano — January 25, 2011 @ 12:23 pm

  2. Como eu disse no post, não recomendo definir codificação de caracteres no php.ini nem no httpd.conf. E se você não tem acesso não faz diferença, a codificação da aplicação sobrescreve qualquer configuração padrão do servidor (no header).

    Ftp é outra história, nas duvido que a codificação influencie em qualquer coisa além dos nomes dos arquivos.

    Comment by diovani — January 25, 2011 @ 2:29 pm

  3. Excelente artigo Paulo Diovani! =]

    Comment by Carlitos — February 26, 2011 @ 3:19 pm

  4. Buena guía, sinceramente, siempre tengo que estar tratando de compatibilizar los códigos, el problema está en que al editar para un sistema u otro tengo que recordar cómo está codificado el sitio.
    Parece un sueño esperar que algún día manejemos todos un estándar único, porsupuesto que la libertad de crear debe ser respetada, y la de investigar por otros caminos, pero se podría tomar lo mejor de cada uno y crear una gran empresa para el bien de todos.

    Comment by serigrafia — April 14, 2011 @ 11:07 am

  5. Todos sites/sitemas existentes em uma única codificação não é algo possível devido às necessidades de linguagem.
    UTF-8 satisfaz certamente a maioria dos casos, mas outros precisam, sim, de codificações diferentes, especialmente idiomas orientais.
    De qualquer modo, manter uma codificação única em toda a aplicação é importante, mesmo que não seja utf-8.

    Obs.: Favor, português ou inglês, apenas, ao comentar no meu blog.

    Comment by diovani — April 14, 2011 @ 1:53 pm

RSS feed for comments on this post. TrackBack URI

Leave a comment