Codificação de caractere e o Ubuntu pt_BR

[Atualizado em 2008-01-04.]

O suporte a idiomas e configurações regionais internacionais — a chamada localização ou locale — nos sistemas operacionais e seus aplicativos envolve uma série de aspectos, como: tradução de mensagens; formatos de data, número e moeda; codificação de caractere.

O Ubuntu Linux é uma excelente distribuição livre baseada na Debian, com bom suporte a dispositivos, aplicativos e idiomas. Porém, esta distribuição pode trazer uma pequena dificuldade no suporte ao Português do Brasil: a codificação de caractere. Verifiquei existência dessa situação nas versões do Ubuntu 6.06 LTS (codinome Dapper Drake) e 7.04 (Feisty Fawn). Pode ocorrer em outras versões, mas não testei.

Eis aqui do que se trata e como resolver eventual dificuldade ou incompatibilidade.

Codificação de caracteres

Codificação de caractere é um aspecto técnico existente nos computadores e dispositivos digitais em geral. Para entendê-lo, é preciso saber que toda informação em um computador é armazenada como “bits e bytes”, ou trocando em miúdos, codificada como códigos numéricos. O byte ou octeto é um conjunto de 8 bits (dígitos binários = 0 ou 1) que pode ser representado como um número inteiro entre 0 (00000000) e 255 (11111111).

Cada caractere textual — letra (maiúscula ou minúscula. acentuada ou não), algarismo e símbolo — com o qual o computador lida deve ser representando como um número para que possa ser armazenado em arquivo, transmitido em rede etc. de forma padronizada. O sistema que define uma tabela padronizada com o conjunto de caracteres possíveis em determinado idioma e seus respectivos formatos de representação numérica é chamado codificação de caractere.

Para a maioria do mundo ocidental que usa o alfabeto latino ou romano, um Byte com seus 256 valores possíveis é suficiente para representar todos os caracteres mais comuns dos idiomas, incluindo as letras acentuadas. Existe um padrão internacional para essa codificação de caractere Ocidental denominado ISO/IEC 8859-1. É este padrão que Brasil, Portugal e outros países ocidentais de língua latina em geral utilizam em seus sistemas de computador, principalmente na plataforma Windows.

Alguns idiomas utilizam símbolos e acentuações menos comuns do alfabeto latino e, para estes, existem variações do padrão ISO 8859, como o ISO-8859-15 entre outros. Já idiomas orientais como o japonês e o chinês podem possuir milhares de símbolos em seus alfabetos de forma que apenas um byte não consegue conter toda sua diversidade. Em função disto, existe um padrão internacional de codificação que contempla alfabetos do mundo todo, chamado Unicode (veja unicode.org) ou Universal Character Set (UCS).

Existem alguns formatos de codificação de caractere baseados no Unicode/UCS. Um é o UTF-16 (também conhecido como UCS-2), que usa 16 bits (ou 2 bytes/octetos) para representar os caracteres, o que permite 65526 possibilidades e assim comporta grande diversidade de alfabetos. Como UTF-16 é uma codificação bem diferente da ocidental comum que usa apenas 1 byte, a codificação UTF-8 tenta ser um meio-termo: usa 8 bits para representar os 128 caracteres ASCII básicos, 16 bits para caracteres latinos acentuados e alguns outros alfabetos (como Grego), e 3 ou 4 octetos para demais caracteres e alfabetos.

Assim, caracteres latinos acentuados têm código de 8 bits na ISO 8859-1 mas são codificados no UTF-8 com 16 bits. Ou seja, caracteres latinos acentuados são representados diferentemente em ISO 8859-1 e UTF-8. Os bytes resultantes armazenados são diferentes. Saber em que formato um arquivo ou conteúdo textual qualquer está representado/armazenado é essencial para interpretá-lo corretamente.

Problema e solução no Ubuntu

O problema é que, para o idioma Português do Brasil no Ubuntu (6.06 LTS, 7.04), a codificação de caractere definida como padrão foi a UTF-8, quando o padrão mais comum no país é o ISO-8859-1. O resultado prático dessa divergência é que alguns caracteres acentuados — lidos de arquivos gravados em ISO-8859-1, mas indevidamente interpretados como UTF-8 — não são exibidos corretamente, muitas vezes aparecendo como uma interrogação ou outros símbolos estranhos.

Para corrigir o problema, basta definir a codificação de caractere padrão como ISO-8859-1 no locale para Português do Brasil (pt_BR), conforme apresentado neste texto: ISO-8859-1 no Dapper (FINAL). Reproduzo os passos a seguir:

  1. Certifique-se que os seguintes pacotes estejam instalados:
    • language-pack-pt
    • language-pack-pt-base

    Para instalar, você pode usar o Gerenciador de Pacotes Synaptic (gráfico), ou executar esta linha de comando (requer sudo / permissão de root):
    $ sudo apt-get install language-pack-pt language-pack-pt-base

  2. Edite o arquivo /var/lib/locales/supported.d/local e adicione a seguinte linha no início do arquivo (requer sudo / permissão de root):
    pt_BR.ISO-8859-1 ISO-8859-1
  3. Edite o arquivo /etc/locale.alias e adicione a seguinte linha (requer sudo / permissão de root):
    pt_BR pt_BR.ISO-8859-1
  4. Edite o arquivo /etc/environment e altere o parâmetro LANG da seguinte forma (requer sudo / permissão de root):
    LANG="pt_BR"
  5. Atualize os locales, com o comando (requer sudo / permissão de root):
    $ sudo dpkg-reconfigure locales
  6. Para ativar imediatamente as novas configurações no ambiente gráfico, reinicie o seu X, com a seguinte combinação de teclas:
    [Ctrl] + [Alt] + [Backspace]
  7. Abra o arquivo ~.bashrc (no seu home) e adicione a seguinte linha no final do arquivo [NOTA: para mim, este passo não foi necessário]:
    source /etc/environment

Problemas similares

Agora que você já sabe da divergência entre os padrões de codificação de caractere ISO-8859-1 e UTF-8, saiba também que em vários outros ambientes pode ocorrer este problema, quando um conteúdo gravado em ISO-8859-1 é incorretamente classificado ou assumido como UTF-8, ou vice-versa, levando à exibição incorreta.

Um situação comum ocorre na web. Se você abrir uma página web e caracteres estranhos aparecerem no lugar da acentuação, é provável que a identificação de codificação de caractere da página tenha sido incorreta.

Em geral, a causa do problema é um erro de configuração no servidor web ou no sistema operacional deste, onde a codificação de caractere padrão esteja definida como UTF-8, mas a página web apresentada usa efetivamente ISO-8859-1, ou vice-versa. Isso faz com que o servidor web especifique no cabeçalho HTTP o conjunto de caracteres (Content-Type charset, conforme RFC 2616 seção 14.17) incorreto.

Outras vezes, a culpa é da própria página HTML, que pode ter informado o conjunto de caracteres incorreto em suas tags de configuração (meta http-equiv=”Content-Type” ou xml encoding). De uma forma ou de outra, a informação errada fornecida ao navegador web induz ao erro na exibição.

Nestes casos, primeiro tente a seleção automática de codificação, usando a opção de menu Exibir » Codificação » Selecionar automaticamente/Universal (Mozilla Firefox) ou Seleção automática (Internet Explorer). Se não funcionar, você pode contornar o problema de uma página ou site específico forçando manualmente a codificação de caractere, para UTF-8 ou ISO-8859-1, no menu Exibir » Codificação do navegador. Ao sair da página ou site problemático, lembre-se de retornar a codificação de caractere no navegador para automática.

Olhando à frente para internacionalização

Embora o padrão ISO-8859-1 seja atualmente muito adotado em arquivos texto no Brasil — em grande parte por coincidir com a página de código padrão do Windows em Português e outros países ocidentais — e comporte de forma satisfatória os caracteres acentuados do alfabeto latino ocupando um byte por caractere, ele não é uma imposição.

Em conteúdo e aplicações, principalmente na Internet, onde aspectos de internacionalização são importantes, o formato Unicode com a codificação UTF-8 é a principal alternativa quando se deseja ou se necessita uma codificação universal que comporte qualquer idioma.

Se sua prioridade não for compatibilidade com conteúdo legado em codificação ISO-8859-1 e sim suporte a internacionalização, o UTF-8 padrão do Ubuntu é opção adequada.

Para saber mais (maioria em inglês):

22 Replies to “Codificação de caractere e o Ubuntu pt_BR”

  1. Gostei do texto, esse negócio de mudar o pt-br para utf8 no ubuntu deu muita dor de cabeça.
    No firefox toda vez que eu vou em exibir > codificação e escolho ISO-8859-1 ele corrige as interrogações que ficava nos lugares dos acentos, mas se eu atualizar a página ele volta ao UTF8 tem como deixar padrão ISO-8859-1 no firefox?

  2. Atualizei o artigo para falar da seleção automática de codificação nos navegadores web. Experimente primeiro este recurso no Firefox, como indicado agora no artigo.

    Forçar um padrão no navegador também é um problema, pois sites em outro padrão seriam exibidos errado.

    Como a origem do erro é em geral no servidor web (mal configurado) que envia (no cabeçalho HTTP de resposta) informação errada sobre a página, fica difícil evitar o erro no lado cliente.

  3. Interessante o seu artigo, mas estou enfrentando um problema similar, mas com firefox, quando eu faço o download de um arquivo com acentuação ou com “ç” aparece vários caracteres estranhos.
    Eu usei o comando locale e o meus sistema e todo padrão pt-br “iso ISO-8859-1” eu uso o linux kurumin versão 7 final.
    Como faço para remeidar essa situação?
    Obrigado.
    Washington Prata.

  4. Washington: Se você está obtendo um arquivo de um site de terceiros, o problema pode estar no site ou no próprio arquivo, fazendo com que ele seja incorretamente tratado pelo navegador web, conforme o artigo cita.

    Outro problema pode ser você tentar editar, por exemplo, um arquivo codificado em UTF-8 em um editor de texto que não suporta ou não está corretamente configurado para este formato.

    No Linux, se você quiser identificar fisicamente o conjunto de caracteres utilizado em um arquivo, pode experimentar listar o conteúdo com codificação hexadecimal e ver se caracteres acentuados com problema estão ocupando um octeto (caso típico do ISO-8859-1) ou dois (UTF-8):
    od -x -c seuarquivo | less

    Para auxiliar, a seguinte página apresenta o código dos caracteres acentuados latinos em ISO 8859-1 (hexa 0xA0 a 0xFF):
    http://www.mhavila.com.br/topicos/mm/char_maps.html

  5. Aqui estou usando o Kubuntu 7.04, tive o mesmo problema com relação a codificação, mas não lembro exatamente todos os passos que segui para resolver… agora fiz uma nova instalação e estou tentando resolver tal problema e não estou conseguindo. Segui os passos acima mas no console continuo com problema, na interface gráfica (kde) não tenho problema algum, mas no console não tem jeito da acentuação ficar correta.

  6. Consegui resolver o problema, após alguma queima de neutrônios (nem neurônios é mais), lembrei de instalar e configurar o “console-data”, agora está tudo 100%, pelo menos por enquanto… hehehe

    valeu

  7. Ótimo artigo. Somente um arquivo a mais – caso queira ter o seu X com o mesmo encoding da console, edite o arquivo : ~/.dmrc

  8. Discordo que isso seja um problema…
    Problema e esse sopa de codificações. com cada pais querendo uma ISO pra eles assim uns usando ISO-8859-1 outros ISO-8859-15 e por ai vai… o UTF-8 veio pra unificar essa bagunça… todo mundo pode escrever em UTF-8 e fica legal…

    O Ubuntu suporta num so CD mais de 20 linguas… todas com suporte UTF-8… ou seja foi feito pra ser assim.. desde a versão 4.10 (a 1ª versão do ubuntu em 2004) ate a mais nova 7.10 todas usam UTF-8 pra todas as linguas inclusive Português do Brasil… Isso não é problema. é olhar pra frente! Adotar o padrão que propoe uma soluçao pra sopa de codificações com uma codificação unica.

  9. @ZeroA4. Não estou dizendo que a codificação UTF-8 seja um problema. pelo contrário, concordo que é um formato abrangente e flexível, e um padrão altamente recomendável para intercâmbio de informações de propósito geral, principalmente quando o âmbito é internacional como na internet.

    O fato é que o Windows e muitos aplicativos e arquivos/conteúdo atualmente no Brasil usam uma codificação distinta do UTF-8, no caso a ISO-8859-1.

    Independente do 8859-1 ser ou não um formato bom, a situação divergente é real: De um lado, a grande quantidade de conteúdo já existente em ISO-8859-1; de outro, a codificação UTF-8 proposta/adotada como padrão no Ubuntu, além de recomendada para uso em páginas na internet HTML/XHTML e em arquivos XML. O resultado dessa situação gera confusão, e esse é o problema. Ou seja, como você bem disse, “o problema é a sopa de codificações”.

    Se o uso de UTF-8 se popularizar em diversos ambientes, essa divergência tende a diminuir e, com ela, o problema.

  10. Valeu Marcio pela Dica!!
    Não estava conseguindo assistir meus filmes com legendas.
    Depois de ler a sua postagem, fiz tudo direitinho e deu tudo certo!
    Viva o Linux!
    Viva o Ubuntu!

  11. Márcio,
    uso o Ubuntu. Configurei ele corretamente como vc menciona. Uso o mentawai em aplicações web e quando roda minha aplicação os acentos aparecem errados. Tive que configurar o Mozilla para UTF-8 senão os acentos tb ficam errados. Estou realmente precisando configurar meu ambiente de desenvolvimento mas não consigo. Tens como me ajudar a encontrar uma solução?

  12. @R.B.:
    Minha aposta: A configuração do servidor web que você está utilizando no seu Ubuntu (por exemplo, Apache HTTPd ou Tomcat) deve estar definindo como padrão o charset UTF-8 para o tipo MIME HTML (text/html). Verifique os confs do servidor web se isto procede e, se for isso mesmo, altere o charset padrão para ISO-8859-1 que você efetivamente usando.

  13. Caro Márcio,

    Isso é o melhor do Linux. A qualquer tempo e em qualquer lugar, achamos informações extremamente releventes, assim como a sua. Obrigado.

    Tenho uma dúvida, e de ante mão peço desculpas pela minha ignorância no assunto. Sou novato no Ubuntu e em Desenvolvimento Web.

    O fato é o seguinte:

    Uso o ambiente LAMP.

    Concordo com a abrangência da UTF-8, porém, entendo que estamos lidando, no fim da cadeia, com usuários finais, que querem abrir o site e que ele funcione, e ponto.

    Para minha utilização, confecciono tudo em UTF-8, porém, quando preciso publicar, codifico em ISO.

    O fato é que consigo converter tudo, menos, pelo PHPMYADMIN, o “Conjunto de Caracteres MYSQL”, que não sei como modificar para ISO, estando ele em UTF-8. Pode me ajudar.

    Se tiver alguma formar de fazer tudo em UTF-8 e, através de uma tag html, exibir corretamente no RuWindows, eu prefiro.

    Desde já agradeço sua atenção.

  14. @Mariano:
    Muito obrigado pelo seu apoio e sua participação aqui.

    Pelo que pude constatar, o conjunto de caracteres padrão (default character set) utilizado pelo MySQL é o Latin1, que é o ISO 8859-1 ou Windows cp1252. Os conjuntos de caracteres latinos também são chamados de Europeu Ocidental (West European). Veja http://dev.mysql.com/doc/refman/5.0/en/charset-we-sets.html

    O tópico completo sobre suporte a conjuntos de caracteres no MySQL está no manual (versão 5.0, também disponíveis outras versões) está em
    http://dev.mysql.com/doc/refman/5.0/en/charset.html

    Pelo que pesquisei na internet, o PHPMyAdmin tem na aba Operations uma opção para definir (alterar) a variante de conjunto de caracteres (denominada Collation) a ser usada. Veja em
    http://kb.mediatemple.net/questions/138/Default+MySQL+character+set+and+collation

    Você pode usar utf8_general_ci para UTF-8, ou latin1_general_ci para ISO 8859-1 (Latin1, cp1252).

    Mas não domino MySQL para dar maiores orientações sobre alterar arquivos de configuração, comandos administrativos etc. Recomendo procurar ajuda específica.

    O que posso alertar é que, quando estamos falando de aplicações web com banco de dados, a preocupação se multiplica. Deve-se ter o cuidado de tratar corretamente o conjunto de caracteres nas diversas camadas de componentes da aplicação: desde o armazenamento da base de dados (ou seja, no servidor de banco de dados), passando pela interface ou biblioteca cliente de acesso ao banco de dados, os mecanismos de tratamento de texto da linguagem ou plataforma de aplicação (PHP, Java, dotNET etc.) utilizada no desenvolvimento, o servidor web e de aplicação utilizado para disponibilizar a aplicação, até a codificação e especificações dos arquivos web (HTML, XML) criados para a interface de usuário da aplicação.

  15. Prezado Márcio.
    É incrível, mas no Ubuntu 10.10 ainda persiste o problema. Vinha usando o Ubuntu muito feliz, quando, após uma atualização, o sistema mudou a codificação de caracteres. Sou apenas usuário, não entendo de programação. Segui suas instruções e de nada adiantou. Quando tento abrir um arquivo com acentos ou ç no nome, ou que esteja em uma pasta com esses caracteres, no nome, o OpenOffice diz que o arquivo não existe.
    Felizmente mantenho meus arquivos pessoais em um HD separado, para evitar perda. Mas gostaria de remediar o problema sem ter que reinstalar tudo.
    Será que ainda há possibilidade?
    Agradeço desde já, e parabenizo por seu espírito altruístico.

  16. PS
    Quando usei o comando sudo dpkg-reconfigure locales, obtive o seguinte resultado:
    perl: warning: Setting locale failed.
    perl: warning: Please check that your locale settings:
    LANGUAGE = “pt_BR”,
    LC_ALL = (unset),
    LC_MESSAGES = “pt_BR.ISO-8859-1”,
    LANG = “pt_BR”
    are supported and installed on your system.
    perl: warning: Falling back to the standard locale (“C”).
    locale: Cannot set LC_CTYPE to default locale: No such file or directory
    locale: Cannot set LC_MESSAGES to default locale: No such file or directory
    locale: Cannot set LC_ALL to default locale: No such file or directory
    Generating locales…
    en_AG.UTF-8… up-to-date
    en_AU.UTF-8… up-to-date
    en_BW.UTF-8… up-to-date
    en_CA.UTF-8… up-to-date
    en_DK.UTF-8… up-to-date
    en_GB.UTF-8… up-to-date
    en_HK.UTF-8… up-to-date
    en_IE.UTF-8… up-to-date
    en_IN.UTF-8… up-to-date
    en_NG.UTF-8… up-to-date
    en_NZ.UTF-8… up-to-date
    en_PH.UTF-8… up-to-date
    en_SG.UTF-8… up-to-date
    en_US.UTF-8… up-to-date
    en_ZA.UTF-8… up-to-date
    en_ZW.UTF-8… up-to-date
    pt_BR.ISO-8859-1… done
    pt_BR.UTF-8… up-to-date
    pt_PT.UTF-8… up-to-date
    Generation complete.

Deixe uma resposta