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.

[ Hits: 59.873 ]

Por: Dornelles Vissotto Junior em 18/08/2004


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.

   

Páginas do artigo
   1. Codificação de caracteres de arquivos ASCII
Outros artigos deste autor

Comunicações via satélite

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

Vulnerabilidade e segurança no Linux

Redes de comunicação sem fio (Wireless)

Placas NVIDIA com kernel 2.6.8

Leitura recomendada

Como personalizar o prompt do shell bash

Instalando Apache 2.2 com múltiplos sites no OpenSuSE 10.2

Polindo o seu Debian - KDE + Debian-Sid

Instalação do Asterisk - Distribuição Meucci

Reempacotamento e repositório local em um sistema Debian-like

  
Comentários
[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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts