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.