Pular para o conteúdo

Codificação de caracteres de arquivos ASCII

Muitas vezes encontramos incompatibilidade entre o sistema de codificação de caracteres de um sistema para outro e até mesmo dentro do próprio sistema, isso porque existem dois tipos padrões de codificação de caracter para o Brasil. UTF-8 e ISO-8859-1 (ou iso-latin1). Este artigo se propõe a diminuir as mazelas causadas por um ou por outro.
Dornelles Vissotto Junior dvissotto
Hits: 60.940 Categoria: Linux Subcategoria: Configuração
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Codificação de caracteres de arquivos ASCII

Nos primórdios computacionais foi criada uma tabela de caracteres básica que continha 128 caracteres e portanto era possível de ser armazenada em um binário de 7 bits chamado ASCII.

Com a disseminação dos computadores pelo mundo veio a necessidade de incorporar a esta tabela caracteres diferentes (variantes em cada país) composto não apenas por letras, números e sinais, mas por caracteres especiais. Vários países que usam letras acentuadas e assim a tabela foi expandida para binário de 8 bits (256 caracteres).

No entanto, se considerarmos os alfabetos das línguas européias, os alfabetos cirílico (Rússia) e grego, que são totalmente diferentes do alfabeto que nós usamos, 256 caracteres é também insuficiente para descrevê-los.

Para cada necessidade específica foram criadas tabelas de 8 bits e normalizadas pela ISO (International Standardation Organization). Todos eles são compatíveis com o ASCII nos primeiros 128 caracteres, diferenciando-se entre si nos últimos 128 caracteres. Para alguns países da Ásia, onde se usam ideogramas, o binário é de 16 bits.

Vale ressaltar que dentro de um mesmo país pode haver mais de uma tabela sendo usado. Por exemplo, aqui no Brasil usa-se muito o ISO-8859-1 no Linux, e o IBM 850 no DOS, que são incompatíveis.

Muitas vezes encontramos incompatibilidade entre o sistema de codificação de caracteres (character encoding) de um sistema para outro e até mesmo dentro do próprio sistema. Isto porque existem dois tipos padrões de codificação de caracter para o Brasil, em se tratando de Linux. UTF-8 e iso-8859-1 (iso-latin1). Ambas as codificações se baseiam na descrição de caracteres para línguas provenientes do Latin. O problema é: você só consegue usar um charset por vez.

O primeiro é mais novo e se propõe a acabar com a incompatibilidade entre os vários tipos de codificação de caracteres iso-latin0-16, por isto a denominação Unicode ou também latin-extended, principalmente relacionadas aos códigos HTML. O segundo é mais tradicional e vem sendo utilizado amplamente e com sucesso nas mais variadas aplicações.

O UTF-8 veio de um novo código de 16 bits (65536 caracteres - UTF-16), chamado de Unicode, englobando todas as codificações de caracteres em uma única tabela. Isto é, você poderá ler caracteres europeus ou asiáticos sem ter que mudar a codificação, e isto ao mesmo tempo!

O problema é que estes arquivos ficariam enormes, pois usariam 2 bytes por caracter ao invés de 1 byte. O UTF-8 nada mais é do que uma forma alternativa: usa caracteres de bits variáveis. Um caractere alfabético usaria apenas 7 ou 8 bits, e caracteres asiáticos usariam 16 bits.

Uma das maiores complicações na compatibilidade entre os dois sistemas (UTF-8 e iso) está na representação do Cedilha. Enquanto no iso-latin1 o cedilha adota apenas uma codificação para qualquer mapa de teclado ou região, para o UTF-8 o cedilha pode ser representado vezes por cedilha vezes por c com acento. Isto irá depender muito de suas configurações de Localização (locale) como linguagem, tipo de teclado, mapa de teclado.

Estas incompatibilidades ainda acontecem, mesmo com uma correta informação sobre o locale. Quase todas as distribuições têm por padrão estarem adotando a codificação UTF-8. Como é difícil adaptar todos os padrões dos softwares instalados para UTF-8, e até mesmo por incompatibilidade com softwares de edição de documentos (latex principalmente), preferi adotar a tática de mudar a codificação do SO. Isto me rendeu algumas horas de problemas.

Primeiro, as próprias configurações do locale devem ser feitas de tal modo que viabilizem a execução do padrão de caracteres desejado. Por exemplo:

LANG=pt_BR
LANG=pt_BR.ISO-8859-1
LANG=pt_BR.UTF-8

Se a base do SO está instalada com UTF-8, quando setamos apenas pt_BR ele automaticamente faz o link para pt_BR.UTF-8. Este foi um dos problemas que demorei a perceber e que rendeu uma dica neste site "cedilha com o Mandrake 10.0".

Segundo, as definições de programas baseados em gerenciador gráficos podem adotar por padrão a codificação UTF-8. Quase desisti do Mozilla por conta deste problema. Mas depois de inúmeras pesquisas descobri que setar a configuração padrão do GTK resolveria o problema. Este foi outro probleminha que me rendeu mais uma dica neste site "cedilha no Mozilla".

Um outro problema veio a cargo de trabalhar em grupo. Cada pessoa, cada estilo, cada codificação. É a mesma coisa que escrever um mesmo programa um pouco cada programador. Você olha um código anterior e fica meio sem saber o que está acontecendo. Setando a codificação padrão para iso-latin1, quase todos os arquivos UTF-8 conseguem a representação correta, ou seja, são traduzidos.

O problema surge quando você precisa destes arquivos para processar as informações contidas nele, como é o caso do editor latex. Simplesmente coisas que funcionavam deixam de funcionar e aparentemente está tudo correto.

Para solucionar estes problemas, é necessário a conversão da codificação dos arquivos para iso-latin1. Esta conversão, depois de alguma procura, é mais simples do que parece e pode ser feita de duas formas. Abrir o arquivo num editor padrão e salvá-lo com outro nome (ele faz a conversão da codificação automaticamente) ou usar o recode, que é um programa que recodifica arquivos ASCII.

$ recode utf-8..iso-latin1 arquivo
$ recode iso-latin1..utf-8 arquivo


Também é possível usar o programa iconv, que é um programinha interpretador de códigos:

$ iconv -f UTF-8 -t ISO-8859-1 arquivo-utf > arquivo-iso
$ iconv -f ISO-8859-1 -t UTF-8 arquivo-iso > arquivo-utf


Bom, espero que após esta extensa conversa sobre codificação de caracteres as coisas fiquem mais claras para vocês com este artigo.

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
   1. Codificação de caracteres de arquivos ASCII

Como elaborar perguntas para listas de discussão

Comunicações via satélite

Transmissão de dados via telemetria: uma opção de comunicação remota

Vulnerabilidade e segurança no Linux

Configurando placa de som Sound Blaster Live!

APT-GET sem CD: criando repositórios locais

Acertando automaticamente a hora e a data

ArchLinux: Configuração pós-instalação

Instalação e configuração do Bacula com interface web (Bweb/Brestore)

Instalação e configuração da impressora HP 3745 (e similares)

#1 Comentário enviado por fabio em 18/08/2004 - 01:36h
Muito bom o artigo. Curti principalmente os comandos recode e iconv, que me serão muito úteis :P

[]'s
#2 Comentário enviado por y2h4ck em 18/08/2004 - 09:36h
Eu tenho um problema, sempre que eu modifico no SuSE o teclado para padrão pt_BR-abnt ... com ç e tal
uso na boa mas quando reinicio
o micro perde os caracteres de ] e }
no lugar do ] fica /.

eheh vamos ver se consigo arrumar agora.
#3 Comentário enviado por vdiago em 18/08/2004 - 18:25h
Amigo, realmente nunca vi um artigo com tal essencia técnica e o melhor, em poucas linhas. Está de parabéns, e, pela primeira vez, minha visita ao site diaria rendeu algo 100% bom .

Parabéns
#4 Comentário enviado por fabio em 25/01/2005 - 12:46h
Esse artigo vira e mexe me é útil :P
#5 Comentário enviado por luiscarlos em 04/10/2005 - 09:12h
como faço pra mudar a codificação do meu linux, tenho fedora core 4 e gero pdf com php no entanto caracteres aparecem errado, na plataforma win eles ficam perfeitos, qria tentar mudar a cod do meu lin, talvez resolva
#6 Comentário enviado por fernoliv em 20/04/2006 - 08:59h
Muito bom! Graças a este artigo, o Fábio conseguiu me ajudar na conversão de um banco de dados MySQL de UTF-8 para ISO-8859-1.

Obrigado pela dica!

Abraço,

Fernando.
#7 Comentário enviado por FaBMak em 12/07/2006 - 20:54h
Parabéns pelo artigo, literalmente salvou meu banco de dados MySQL.

Valew,

FaBMak
#8 Comentário enviado por robsonjrce em 03/09/2007 - 18:30h
Maravilha!!!
Cara, você me acabou de salvar de uma dor de cabeça.

Valeu.

Contribuir com comentário

Entre na sua conta para comentar.