dom 24 set 2006
Codificação de caractere e o Ubuntu pt_BR
Postado por Márcio sob FAQ , Linux , Sistemas operacionais[22] Comentários
[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:
- 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 - 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 - Edite o arquivo /etc/locale.alias e adicione a seguinte linha (requer sudo / permissão de root):
pt_BR pt_BR.ISO-8859-1 - Edite o arquivo /etc/environment e altere o parâmetro LANG da seguinte forma (requer sudo / permissão de root):
LANG="pt_BR" - Atualize os locales, com o comando (requer sudo / permissão de root):
$sudo dpkg-reconfigure locales - 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] - 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):
- A tutorial on character code issues, em Characters and encodings, por Jukka “Yucca” Korpela.
- Firefox: Por que algumas páginas não mostram palavras acentuadas?, em Firefox Central Brasil.
- Unicode, por Rafael Benevides, 2008-01-04.
- The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!), por Joel Spolsky, 2003-10-08, em Joel on Software.
- Setting up Windows Internet Explorer 5, 5.5 and 6 for Multilingual and Unicode Support e Unicode Support in HTML, HTML Editors and Web Browsers, por Alan Wood, Unicode Resources.
- UTF-8 and Unicode FAQ for Unix/Linux, por Markus Kuhn.
- Latin 1 and Unicode characters in &ersand; entities, por Jane Austen.
- Survival guide to i18n, por Sam Ruby.
- Mapeamento de Caracteres Estendidos, por Márcio d’Ávila, 2007-06-16.
- De UTF-8 para ISO-8859-1 e vice-versa, por Bruno Rossetto Machado, 2008-03-05.
- Cedilha, Gnome, KDE e Ubuntu 8.04 em Inglês, por Vitor Pamplona, 2009-04-18.

novembro 28th, 2006 at 9:48
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?
novembro 28th, 2006 at 21:50
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.
julho 27th, 2007 at 2:06
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.
julho 28th, 2007 at 11:51
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 | lessPara 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
setembro 9th, 2007 at 14:10
ATUALIZAÇÃO: verifiquei que o problema ainda existe no Ubuntu versão 7.04. A solução apresentada funciona igualmente para 6.06 LTS e 7.04.
setembro 9th, 2007 at 18:47
[...] Codificação de caractere e o Ubuntu pt_BR, passando a codificação de caractere padrão de UTF8 para ISO-8859-1. [...]
setembro 18th, 2007 at 2:26
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.
setembro 18th, 2007 at 3:03
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
novembro 8th, 2007 at 23:34
Link útil no tema do artigo:
Caracteres UFT-8 na compilação de fontes no NetBeans 5.5.1
Por Leandro Severino, 2007-11-08.
dezembro 14th, 2007 at 14:17
Ótimo artigo. Somente um arquivo a mais – caso queira ter o seu X com o mesmo encoding da console, edite o arquivo : ~/.dmrc
dezembro 14th, 2007 at 22:28
Olá Nuno. Obrigado pela contribuição. Aproveito para complementar a dica com alguns links a respeito do arquivo de configuração $HOME/.dmrc do Gnome Display Manager:
http://www.cyberciti.biz/tips/gnome-language-encoding-different-than-console.html
http://www.gnome.org/projects/gdm/docs/2.20/configuration.html#userconfig
dezembro 18th, 2007 at 17:26
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.
dezembro 18th, 2007 at 23:35
ZeroA4. Não estou dizendo que a codificação UTF-8 seja um problema. Concordo que é um formato abrangente e flexível.
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. 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.
janeiro 5th, 2008 at 1:27
[...] Aproveito para dizer que atualizei o artigo Codificação de caractere e o Ubuntu pt_BR, de 2006-09-24, após refletir sobre o comentário do leitor ZeroA4 e o artigo Unicode de Rafael Benevides. Como resultado, adicionei um tópico final “Olhando à frente para internacionalização”. [...]
janeiro 7th, 2008 at 21:46
Valeu Marcio pela Dica!!
Não estava conseguindo assistir meus filmes com legendas.
Depois de ler a sua postagem, diz tudo direitinho e deu tudo certo!
Viva o Linux!
Viva o Ubuntu!
janeiro 7th, 2008 at 22:31
Olá JDiniz. Fico feliz da dica ter ajudado!
setembro 5th, 2008 at 16:08
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?
setembro 6th, 2008 at 10:42
@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 parao timo MIME 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.
abril 1st, 2009 at 10:05
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.
abril 1st, 2009 at 10:18
@Mariano:
Muito obrigado pelo seu apoio e sua participação aqui.
Existe uma tag META que informa a codificação de caractere, simulando o respectivo cabeçalho HTTP Content-Type. Você pode adicioná-la às páginas do PHPMyAdmin, todos os browsers modernos interpretam e exibem a codificação corretamente a partir dessa tag.
No link em que falo de HTML no artigo tem o que você procura:
http://www.w3.org/International/O-charset
abril 4th, 2011 at 14: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.
abril 4th, 2011 at 14:23
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.