Tudo o que você queria saber sobre configuração de codificações em português

Por Nuno Cardoso e Alberto Simões

Linguateca


Índice

  1. Codificações usadas para a íngua portuguesa
    1. 1.1. Configuração do ambiente do computador
    2. 1.2. Problemas de codificação entre ambiente e ficheiros
    3. 1.3. Conversão entre codificações
    4. 1.4. Diferenças entre português de Portugal e português brasileiro
  2. Redacção de documentos em português com o LaTeX
    1. 2.1. Codificação do ficheiro
    2. 2.2. Língua do documento
    3. 2.3. Hifenização
  3. O português e os leitores na Rede (browsers)
    1. 3.1. Páginas HTML
    2. 3.2. Páginas XHTML

1. Codificações usadas para a língua portuguesa

A codificação ISO usada em países de língua oficial portuguesa é a ISO-8859-1. Também connhecida por ISO-Latin-1, a ISO-8859-1 engloba as línguas europeias dos países ocidentais (Western Europe).

Também é normal ser usado o ISO-8859-15 para textos em português, uma codificação melhorada do ISO-8859-1 que possui pequenas correcções para o francês, e que inclui o símbolo monetário do euro em detrimento de outros caracteres menos usados.

O Windows-1252 é uma implementação Microsoft que inclui os caracteres do ISO-8859-1, do ISO-8859-15 e mais algumas ligeiras alterações. é mais usado internamente nas aplicações Windows, mas não é invulgar aparecer como a codificação de ficheiros HTML.

A codificação MacRoman é normalmente usada pelos computadores Apple, embora as versões mais recentes do sistema operativo MacOS X tenham adoptado o UTF-8 como codificação padrão, o que levará o MacRoman a ficar em desuso nos próximos tempos. O MacRoman, tal como o Windows-1252, é uma codificação mais vocacionada para as necessidades de um sistema operativo, do que ser propriamente uma codificação usada como padrão entre plataformas. O MacRoman possui várias semelhanças com o ISO-8859-1, mas possui alguns caracteres distintos.

O UTF-8 é um sistema de codificação que procura congregar as diversas codificações ISO numa única só, mantendo a sua compatibilidade. Assim sendo, o UTF-8 usa um único byte para codificar os primeiros 128 caracteres da tabela (os caracteres US-ASCII), e usa dois bytes para os restantes caracteres, o que permite incluir os restantes caracteres das restantes codificações, desde caracteres latinos, eslavos ou gregos, até os caracteres cirílicos, árabes e hindus. Em resumo, a palavra 'pão' no sistema ISO-8859-1 ocupa 3 bytes, enquanto que no sistema UTF-8 ocupa 4 bytes, uma vez que a letra 'ã' é representada com dois bytes.

1.1 Configuração do ambiente de computador

Para usar correctamente determinada codificação numa aplicação de linha de comando é necessário dois tipos de configuração.

Por um lado, é necessário garantir que o sistema operativo tem as tabelas de conversão disponíveis, e que se encontram activas. Para isso, leia a secção Variáveis de Ambiente, abaixo.

Por outro lado, é necessário que a aplicação que está a usar para aceder à linha de comando, ou shell do seu computador está a fazer a mostrar correctamente os caracteres no terminal. Para detalhes sobre esta configuração, leia a secção Configuração do Terminal

1.1.1 Variáveis de ambiente

Em sistemas operativos com base no UNIX, como o Linux ou o Mac OS X, existem variáveis de ambiente que configuram a língua e a respectiva codificação usada, e que são usadas pelo sistema desde as operações básicas na linha de comandos, como é o exemplo de ordenação de linhas de texto ou a formatação de datas, até à gestão de ficheiros de texto ou a tradução de aplicações (através do i18n).

Em ambiente Windows, a alteração da página de codificação é feita através de um comando, o chpg.

Estas variáveis de ambiente pode ser vistas através do comando locale. Um exemplo de resposta desse comando pode ser:

[linha de comandos]$ locale
LANG="pt_PT.UTF-8"
LC_COLLATE="pt_PT.UTF-8"
LC_CTYPE="pt_PT.UTF-8"
LC_MESSAGES="pt_PT.UTF-8"
LC_MONETARY="pt_PT.UTF-8"
LC_NUMERIC="pt_PT.UTF-8"
LC_TIME="pt_PT.UTF-8"
LC_PAPER="pt_PT.UTF-8"
LC_NAME="pt_PT.UTF-8"
LC_ADDRESS="pt_PT.UTF-8"
LC_TELEPHONE="pt_PT.UTF-8"
LC_MEASUREMENT="pt_PT.UTF-8"
LC_IDENTIFICATION="pt_PT.UTF-8"
LC_ALL=

LANG é a variável de ambiente usada como substituto para qualquer variável LC_* que não está especificada. LC_ALL funciona como uma variável que tem precedência sobre todas as outras variáveis LC_*. A variável LC_COLLATE define as regras de ordenação para os caracteres. LC_CTYPE define as regras de interpretação de maiúsculas, minúsculas, dígitos, etc. LC_MONETARY possui as definições locais para representar valores monetários. LC_NUMERIC define os caracteres separadores de milhares e o ponto decimal. LC_TIME engloba as definições de representação de datas. LC_MESSAGESpossui algumas mensagens típicas dos SO nas respectivas línguas. LC_PAPER define tamanhos standard de páginas, como é o caso do A4 em Portugal. LC_NAME possui definições sobre a correcta apresentação dos nomes e títulos das pessoas. LC_ADDRESS configura a forma de representação de endereços, e LC_TELEPHONE faz o mesmo para números de telefone. LC_MEASUREMENT estabelece os sistemas métricos usados, e LC_IDENTIFICATION identifica o sistema de internacionalização usado, como por exemplo o i18n.

O comando localedef é usado para criar ambientes locale(em certas distribuições, o localedef é substituído pelo locale-gen). Se a máquina usada, por exemplo, não possuir o ambientept_PT em ISO-8859-1, este pode ser criado através do comando:

[linha de comandos]$ localedef -ci pt_PT -f ISO-8859-1 pt_PT.ISO-8859-1
ou
[linha de comandos]$ locale-gen pt_PT.ISO-8859-1

Para alterar o ambiente da sessão actual, modifica-se o valor da variável LANG, através de:

[linha de comandos]$ export LANG="pt_PT"

é possível também especificar uma determinada codificação, como é o exemplo de:

[linha de comandos]$ export LANG="pt_PT.ISO-8859-1"
[linha de comandos]$ export LANG="pt_PT.UTF-8"

1.1.2 Configuração do Terminal

Dependendo do ambiente que usa poderá ter de configurar o seu terminal para reconhecer correctamente os caracteres na codificação que escolheu.

1.2 Problemas de codificação entre ambiente e ficheiros

Ao processar um ficheiro, é imperativo que se tenha em atenção que a codificação do ficheiro seja a mesma codificação do ambiente de trabalho. Tomando por exemplo as diferenças de codificação entre ISO-8859-1 e UTF-8, e um ficheiro com a palavra 'pão', ou seja, constituído por três letras mais o caracter EOF, vemos que:

  1. O ficheiro codificado em ISO-8859-1 possui 4 bytes. Num ambiente com LANG=pt_PT.ISO-8859-1, o ficheiro deve ler-se correctamente.
  2. O ficheiro codificado em UTF-8 possui 5 bytes. Num ambiente com LANG=pt_PT.UTF-8, o ficheiro deve ler-se correctamente.
  3. O ficheiro codificado em ISO-8859-1 possui 4 bytes. Num ambiente com LANG=pt_PT.UTF-8, a visualização do ficheiro não mostra o caracter 'ã' devidamente, sendo na maioria das vezes apresentado um ponto de interrogação (dependendo do sistema e da aplicação).
  4. O ficheiro codificado em UTF-8 possui 5 bytes. Num ambiente com LANG=pt_PT.ISO-8859-1, a visualização do ficheiro não mostra o caracter 'ã' devidamente, sendo na maioria das vezes apresentada dois caracteres quaisquer (dependendo do sistema e da aplicação).

A ordenação em SO baseados em UNIX é feita pelo comando sort, que usa o locale para usar as regras de ordenação definidas, como se pode observar no exemplo seguinte:

(LANG está definida como POSIX, o padrão usado e que aplica as regras do inglês)

[linha de comandos]$ sort lista_utf8.txt
0
9
A
a
e
o
u
ã
ç
ã
ç
é
ó
ú

[linha de comandos]$ export LANG=pt_PT.UTF-8

[linha de comandos]$ sort lista_utf8.txt
0
9
a
A
ã
ã
ç
ç
e
é
o
ó
u
ú

O comando file é uma boa ajuda para identificar as codificações de ficheiros de texto. Contudo, o comando file é muitas vezes falível, uma vez que o preâmbulo de muitos ficheiros é feito só com caracteres ASCII (por exemplo, a etiqueta <?xml> de um ficheiro XML).

[linha de comandos]$ file lista_iso.txt
lista_iso.txt: ISO-8859 text
[linha de comandos]$ file lista_utf8.txt
lista_utf8.txt: UTF-8 Unicode text

Uma dica de utilização é aplicar o comando file à cauda do ficheiro em vez do cabeçalho, aumentando as hipóteses de detectar a codificação correcta.

Assim, pode-se usar a seguinte linha de comandos:

[linha de comandos]$ tail lista_iso.txt | file -
lista_iso.txt: ISO-8859 text

1.3 Conversão entre codificações

Uma vez que o UTF-8 tem por objectivo reunir todos os tipos de codificação de uma forma compatível, não há entraves na conversão de um ficheiro ISO-8859-1 para UTF-8, uma vez que todos os caracteres são suportados pelo UTF-8. O inverso é que já não é verdade, e por vezes não é possível converter um ficheiro UTF-8 em ISO, uma vez que alguns caracteres fora do mapa de codificação ISO não conseguem ser convertidos.

O programa iconv faz a conversão de ficheiros de texto entre codificações. O parâmetro -f, from, define a codificação original do ficheiro a converter, e o parâmetro -t, to, define a codificação pretendida. O ficheiro recodificado é impresso para o STDOUT, se entretanto não for especificado o parâmetro -o, output. Por exemplo, para uma conversão de um ficheiro, lista_utf8.txt de UTF-8 para ISO-8859-1, invoca-se o seguinte comando:

[linha de comandos]$ iconv -f utf-8 -t iso-8859-1 lista_utf8.txt > lista_iso.txt

1.4 Diferenças entre português de Portugal e português brasileiro

Segundo o que está definido no locale, as diferenças principais entre pt_PT e pt_BR resumem-se a ligeiras alterações em LC_COLLATE, provavelmente devido à inclusão do caracter ü na variante brasileira, às diferenças monetárias (designação, símbolo da moeda usada e estilo de representação de valores monetários), formato de representação de números de telefone ou a utilização ou não de maiúsculas para os meses e os dias de semana, na representação de datas.

O exemplo seguinte ilustra como a variante de português tem influência no comando date:

[linha de comandos]$ export LANG=pt_PT
[linha de comandos]$ date +%A
Terça

[linha de comandos]$ export LANG=pt_BR
[linha de comandos]$ date +%A
terça

2. Redacção de documentos em português com o LaTeX

Para escrever correctamente em LaTeX em português, há que ter em atenção três configurações essenciais do documento:

2.1 Codificação do ficheiro

Ao redigir um documento LaTeX, é preciso indicar ao compilador TeX qual é a codificação original do ficheiro. A definição da codificação usada é feita no preâmbulo do ficheiro .tex, através do pacote inputenc, da seguinte forma:

\usepackage[latin1]{inputenc}, para ficheiros codificados em ISO-8859-1.

\usepackage[utf8]{inputenc}, para ficheiros codificados em UTF-8.

Nota: para certos sistemas UNIX, é preciso usar o pacote ucs para adicionar suporte para Unicode:

\usepackage[ucs}

\usepackage[utf8x]{inputenc}

2.2 Língua do documento

Alguns modelos de documentos possuem palavras-chave já pré-definidas para cada língua, como por exemplo 'Capítulo', 'Figura' ou 'Tabela'. Para que o compilador TeX saiba qual é a língua a aplicar quando esses campos são invocados, é preciso especificar na linha do preâmbulo que especifica a classe de documentos (\documentclass).

Por exemplo, a redacção de um documento usando o modelo 'article' configurada para folhas A4 e com tamanho de letra de 10 pontos possui a seguinte linha de preâmbulo:

\documentclass[a4paper,10pt]{article}

Para configurar este mesmo documento para português, adiciona-se o parâmetro 'portuges' à definição do modelo do documento (note-se que é portuges, e não portugues, devido às limitação de 8 caracteres imposta na altura para representar as línguas), ficando então na seguinte forma:

\documentclass[a4paper,10pt,portuges]{article}

No entanto, note-se que há distribuições de Linux mais recentes que já rectificaram o parâmetro para portugues.


Caso seja necessário, é possível redefinir posteriormente as palavras-chave do modelo do documento através do comando \renewcommand, como é ilustrado no seguinte exemplo:

\newcommand{\abstractname}{Resumo}
\newcommand{\contentsname}{\'{I}ndice}
\newcommand{\listfigurename}{Lista de Figuras}
\newcommand{\listtablename}{Lista de Tabelas}
\newcommand{\partname}{Parte}
\newcommand{\chaptername}{Cap\'{i}tulo}
\newcommand{\appendixname}{Anexo}
\newcommand{\appendixtocname}{Anexo}
\newcommand{\appendixpagename}{Anexo}
\newcommand{\bibname}{Refer\^{e}ncias}
\newcommand{\indexname}{\'{I}ndice Remissivo}
\newcommand{\figurename}{Figura}
\newcommand{\tablename}{Tabela}
\newcommand{\figurerefname}{Figura}
\newcommand{\tablerefname}{Tabela}
\newcommand{\pagename}{p\'{a}gina}
\newcommand{\pagerefname}{p\'{a}gina}
\newcommand{\partrefname}{Parte~}
\newcommand{\chapterrefname}{Cap\'{i}tulo}

Também pode ser usado o parâmetro 'brazil' em vez de 'portuges', reflectindo algumas diferenças em relação a palavras-chave entre as duas variantes. Ao usar 'brazil', por exemplo, a tabela de conteúdos do documento é intitulada de Sumário, em vez de Conteúdo.

2.3 Hifenização

A hifenização é configurada no TeX através do pacote babel, através da seguinte linha de preâmbulo:

\usepackage[portuges]{babel}

ou \usepackage[brazil]{babel}, caso se encontre definida como tal.

Em certos casos, a hifenização em português pode não estar activa por defeito. Assim sendo, é preciso reconfigurar o TeX com a ferramenta texconfig.

[linha de comandos]$ textconfig

Aparecerá uma interface de configuração do TeX (note-se que é preciso ter as devidas permissões no sistema para poder reconfigurar o TeX). Escolhe-se a opção HYPHENATION, e de seguida escolhe-se a opção latex

De seguida, o configurador carrega um ficheiro de configuração (normalmente localizado em /usr/share/texmf/tex/generic/config/language.dat) que define as hifenizações a serem inicializadas no initTeX. Para garantir a correcta hifenização em português, confirmar que a linha:

portuges pt8hyph.tex

está descomentada (isto é, não começa com um caracter %). Depois de guardar as alterações ao ficheiro, deve-se correr o comando mktexlsr para que as alterações sejam propagadas para os devidos ficheiros de parametrização do TeX.

Ao correr o comando latex sobre um documento .tex, é possível observar uma lista de línguas incluídas no initTeX para a hifenização. O exemplo abaixo diz respeito a essa lista, para um ambiente TeX configurado de forma a incluir as regras de hifenização de todas as línguas referidas no ficheiro language.dat, incluíndo o português.

Babel <v3.8h> and hyphenation patterns for english, usenglishmax, dumylang, nohyphenation, arabic, basque, bulgarian, coptic, welsh, czech, slovak, german, ngerman, danish, esperanto, spanish, catalan, galician, estonian, farsi, finnish, french, greek, monogreek, ancientgreek, croatian, hungarian, interlingua, ibycus, indonesian, icelandic, italian, latin, mongolian, dutch, norsk, polish, portuguese, pinyin, romanian, russian, slovenian, uppersorbian, serbian, swedish, turkish, ukenglish, ukrainian, loaded.

Caso pretenda definir o caracter usado na quebra de palavras, usa-se o comando \defaulthyphenchar, que indica o índice do caracter a usar, de acordo com o pacote de fonte usada. Como tal, se se usar as fontes T1, usa-se o seguinte preâmbulo:

\lccode`\-=`\-

\defaulthyphenchar=127

\usepackage[T1]{fontenc}

Para fontes LY1, usa-se o seguinte preâmbulo:

\lccode`\-=`\-

\defaulthyphenchar=173

\usepackage[LY1]{fontenc}

Também é possível contornar as regras de hifenização para certos termos, quer definindo os pontos de quebra, quer forçando o termo a não ser quebrado, através do comando \hyphenation. No exemplo seguinte, o termo Linguateca é definido com um termo a não ser quebrado, enquanto que o termo atomização refere explicitamente os pontos de quebra que podem ser usados. Os diversos termos são separados por vírgulas.

\hyphenation{

Linguateca,

a\-to\-mi\-za\-ção

}

Ainda assim, caso a hifenização que vem por omissão do LaTeX não se revelar satisfatória, é possível substituir o ficheiro de regras por um novo ficheiro com novas regras de hifenização. Em http://www.ieeta.pt/~tos/TeX.html é possível descarregar um novo pacote de regras de hifenização para LaTeX em português. Para tal, basta copiar o ficheiro novo (pthyph-novoficheiro.tex) para a directoria onde estão os outros ficheiros de regras de hifenização (normalmente, em /usr/share/texmf/tex/generic/hyphen), e repetir o processo anterior, mas desta forma apontando para o novo ficheiro da seguinte forma:

portuges pt8hyph-novoficheiro.tex

e eliminando (ou comentando) a linha anterior para o portuges.

3. O português e os leitores na Rede (browsers)

3.1 Páginas HTML

Na redacção de páginas HTML, deve ter-se especial atenção à codificação dos ficheiros HTML. é recomendado especificar a codificação usada da página no cabeçalho <HEAD>, para que os navegadores possam exibir a página com a codificação correcta. A linha usada é a seguinte:

<META http-equiv="Content-Type" CONTENT="text/html; charset=ISO-8859-1">, para especificar a codificação ISO-8859-1.

<META http-equiv="Content-Type" CONTENT="text/html; charset=UTF-8">, para especificar a codificação UTF-8.

A codificação especificada nessas etiquetas <META> é usada preferencialmente pelo servidor web no envio da página por HTTP, independentemente da sua configuração por omissão. Servidores web como o Apache permitem configurar a codificação padrão a usar no envio de documentos de texto. Por exemplo, para configurar o Apache de forma a servir páginas segundo a codificação ISO-8859-1, basta adicionar a linha no ficheiro /etc/httpd/conf/httpd.conf:

AddDefaultCharset ISO-8859-1

No entanto, se a página HTML servida estiver codificada em UTF-8 e não possuir informação sobre a sua codificação no cabeçalho, esta será enviada incorrectamente pelo servidor web em ISO-8859-1, o que tornará a sua visualização difícil.

3.2 Páginas XHTML

O XHTML tem vindo a ganhar mais popularidade e como tal, também é importante referir os cuidados que se deve ter ao criar documentos em xhtml. O preâmbulo do XHTML é semelhante ao do XML, com uma etiqueta que identifica a versão e a codificação. Por exemplo:

<?xml version="1.0" encoding="iso-8859-1"?>

<html>

...

</html>


Última actualização: 14 de Março de 2011.
Perguntas, comentários e sugestões