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.
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.
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.
[]'s