Usando UTF-8 com o Gentoo Thomas Martin Alexander Simonov Shyam Mani Marcelo Góes Este guia mostra como configurar e usar o conjunto de caracteres UTF-8 Unicode com seu sistema Gentoo Linux, depois de explicar os benefícios do Unicode e mais especificamente do UTF-8. 2.17 2006-02-11 Codificação de caracteres
O que é uma codificação de caracteres?

Os computador não entendem texto por si só. Ao invés disso, cada caractere é representado por um número. Tradicionalmente, cada conjunto de números usados para representar alfabetos e caracteres (conhecido como sistema de codificação, conjunto de codificação ou caracteres) era limitado em tamanho devido a limitações de hardware de computador.

A história da codificação de caracteres

O conjunto mais comum de caracteres (ou pelo menos o mais aceito) é o ASCII (American Standard Code for Information Interchange). Sabe-se que o ASCII é o padrão de software com mais sucesso de todos os tempos. O ASCII moderno foi padronizado em 1986 (ANSI X3.4, RFC 20, ISO/IEC 646:1991, ECMA-6) pelo American National Standards Institute.

O ASCII tem estritamente sete bits, significando que usa padrões de dígitos representáveis por sete digitos binários, o que fornece um alcance de 0 a 127 em decimais. Isto inclui 32 caracteres de controle não visíveis, a maior parte entre 0 e 31, com o caractere de controle final, DEL ou delete em 127. Os caracteres de 32 a 126 são caracteres visíveis: um espaço, marcas de pontuação, letras latinas e números.

O oitavo bit em ASCII era originalmente usado como um bit de paridade para a verificação de erros. Se isto não é desejado, é deixado como 0. Isto significa que, com ASCII, cada caractere é representado por um único byte.

Embora o ASCII fosse suficiente para comunicação em inglês moderno, em outras línguas européias que incluem caracteres acentuados as coisas não foram tão fáceis. Os padrões ISO 8859 foram desenvolvidos para satisfazer essas necessidades. Eles eram compatíveis com ASCII, mas ao invés de deixar o oitavo bit em branco, era usado para permitir mais 127 caracteres em cada codificação. As limitações do ISO 8859 logo vieram à luz, e existem atualmente 15 variantes do padrão ISO 8859 (de 8859-1 até 8859-15). Fora do alcance de bytes do conjunto de caracteres compatível com ASCII, existe freqüentemente um conflito entre as letras representadas por cada byte. Para complicar a interoperabilidade de codificações de caracteres ainda mais, Windows-1252 é usado em algumas versões do Microsoft Windows para línguas do oeste europeu. Este é um super-conjunto de ISO 8859-1, todavia diferente de várias maneiras. Todos conjuntos, porém, têm compatibilidade com ASCII.

O desenvolvimento necessário de codificações completamente diferentes para alfabetos não-latinos, como a EUC (Extended Unix Coding), que é usado para japonês e coreano (e em menor escala para chinês) criou mais confusão, enquanto outros sistemas operacionais ainda usavam diferentes conjuntos de caracteres para as mesmas línguas, por exemplo, Shift-JIS e ISO-2022-JP. Usuários que desejassem ver glifos em cirílico tinham que escolher entre KOI8-R para russo e búlgaro ou KOI8-U para ucraniano, bem como todas as codificações de cirílico como o mal-sucedido ISO 8859-5, e o mais conjunto mais comum Windows-1251. Todos destes conjuntos de caracteres quebraram grande parte da compatibilidade com ASCII (embora a codificação de KOI8 colocasse os caracteres cirílicos em ordem latina, então caso o oitavo bit fosse tirado, o texto ainda é decifrável em um terminal ASCII através de transliteração reversa.)

Isto levou a muita confusão, e também a uma quase total falta de capacidade para comunicação multi-língüe, especialmente em diferentes alfabetos. Aqui entra o Unicode.

O que é Unicode?

O Unicode livra-se da limitação de um único bit tradicional dos conjuntos de caracteres. Ele usa 17 "planos" de 65,536 pontos de código para descrever um máximo de 1,114,112 caracteres. Já que o primeiro plano, conhecido como "Basic Multilingual Plane" ou BMP, contém quase tudo que você precisará usar, muitos fizeram a presunção errada de que o Unicode era um conjunto de caracteres de 16 bits.

O Unicode foi mapeado de diversas maneiras, mas os dois mais comuns são o UTF (Unicode Transformation Format) e UCS (Universal Character Set). O número após UTF indica o número de bits em uma unidade, enquanto o número após UCS indica o número de bytes. UTF-8 tornou-se o meio mais comum de intercâmbio de texto em Unicode como resultado de sua natureza limpa de oito bits, e é o assunto deste documento.

UTF-8

O UTF-8 é uma codificação de caracteres de tamanhos variáveis, o que neste exemplo significa que usa de 1 a 4 bytes por símbolo. Então, o primeiro byte de UTF-8 é usado para codificar ASCII, dando ao conjunto de caracteres compatibilidade com ASCII. UTF-8 significa que ASCII e caracteres latinos são intercambiáveis com pouco aumento no tamanho dos dados, porque somente o primeiro bit é usado. Usuários de alfabetos orientais como japonês, a quem foram designados um alcance de bytes maior são menos felizes, já que isso resulta em até 50% de redundância em seus dados.

O que UTF-8 pode fazer por você

UTF-8 permite que você trabalhe em um ambiente multi-língüe e internacionalmente aceito que atende a padrões, com uma redundância de dados comparativamente baixa. UTF-8 é o modo preferível de transmitir-se caracteres não-ASCII através da Internet, através de E-Mail, IRC ou qualquer outro meio. Apesar disso, muitas pessoas consideram UTF-8 em comunicação online um excesso. É sempre melhor saber sobre a atitude em relação a UTF-8 em um canal específico, lista de e-mails ou grupo de Usenet antes de usar UTF-8 em formato não-ASCII.

Configurando UTF-8 com o Gentoo Linux
Encontrando ou criando locales de UTF-8

Agora que você entende os princípios por trás do Unicode, você está pronto para começar a usar UTF-8 em seu sistema.

O requisito preliminar para UTF-8 é ter uma versão do glibc instalada que tenha suporte de línguas nacionais. O meio recomendado de fazer-se isso é o arquivo /etc/locales.build com combinação com a opção de USE userlocales. Está além do foco deste guia explicar o uso deste arquivo, embora, para nossa sorte, o uso do arquivo é bem documentado com comentários nele. Também é explicado no Guia de localização do Gentoo Linux.

A seguir, precisamos decidir se uma locale de UTF-8 já está disponível para nossa língua, ou se precisamos criar uma.

(Troque "en_GB" por seu ajuste de locale desejado)
# locale -a | grep 'en_GB'
en_GB
en_GB.UTF-8

Da saída da linha de comando, temos que obter o resultado com um sufixo semelhante a .utf8. Se não há resultado com um sufixo semelhante a .utf8, precisamos criar um locale compatível com UTF-8.

Só execute a seguinte listagem de código se você não tiver um locale de UTF-8 disponível para sua língua.
(Troque "en_GB" com seu ajuste de locale desejado)
# localedef -i en_GB -f UTF-8 en_GB.utf8

Outra maneira de incluir um locale de UTF-8 é adicioná-lo ao arquivo /etc/locales.build e reconstruir o glibc com a opção de USE userlocales configurada.

en_GB.UTF-8/UTF-8
Configurando o locale

Existe uma variável de ambiente que precisa ser configurada para poder usar nossos novos locales de UTF-8: LC_ALL (esta variável sobrecarrega o ajuste LANG também). Também há vários modos de configurá-la; algumas pessoas preferem só ter um ambiente de UTF-8 para um usuário específico, caso em que configuram seu ~/.profile (se você usar /bin/sh), ~/.bash_profile ou ~/.bashrc (se você usar /bin/bash).

Outros preferem configurar o locale globamente. Uma circunstância específica onde o autor particularmente recomenda fazê-lo é quando o /etc/init.d/xdm estiver em uso, porque este script de init inicia o gerenciador de display e desktop antes de quaisquer arquivos de inicialização de shell serem lidos, e logo antes de quaisquer variáveis estarem no ambiente.

Configurar o locale globamente deve ser feito usando o /etc/env.d/02locale. O arquivo deve parecer-se algo como o seguinte:

(Como sempre, troque "en_GB.UTF-8" por seu locale)
LC_ALL="en_GB.UTF-8"

A seguir, o ambiente deve ser atualizado com a mudança.

# env-update
>>> Regenerating /etc/ld.so.cache...
 * Caching service dependencies ...
# source /etc/profile

Agora, rode locale sem argumentos para ver se nós temos as variáveis corretas em nosso ambiente:

# locale
LANG=
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=en_GB.UTF-8

Isto é tudo. Você está agora usando locales de UTF-8, e o próximo passo é a configuração de aplicações que você usa rotineiramente.

Suporte de aplicações

Quando o Unicode começou a ganhar momento no mundo do software, conjuntos de caracteres de múltiplos bits não funcionavam bem com línguas como C, na qual muitos dos programas de uso diário são escritos. Até hoje, alguns programas não são capazes de lidar com UTF-8 adequadamente. Felizmente, a maioria é!

Nomes de arquivo, NTFS e FAT

Existem várias opções de NLS no menu de configuração de kernel do Linux, mas é importante não se confundir! Para a maior parte, a única coisa que você precisa fazer é construir suporte de UTF-8 NLS no kernel, e mudar a opção padrão de NLS para utf8.

File Systems -->
  Native Language Support -->
    (utf8) Default NLS Option
    <*> NLS UTF8
    (Também marque <*> em outros conjuntos de caracteres que são usados por
    sistemas de arquivos FAT ou CD-ROMs Joilet.)

Se você planeja montar partições NTFS, você pode ter que especificar uma opção nls= para o mount. Se você planeja montar partições FAT, você precisa especificar uma opção codepage= com o mount. Opcionalmente, você pode configurar uma codepage padrão para FAT na configuração do kernel. Note que a opção codepage com mount irá sobrepor-se ao ajuste do kernel.

File Systems -->
  DOS/FAT/NT Filesystems  -->
    (437) Default codepage for fat

Você deve evitar configurar Default iocharset for fat como UTF-8, já que não é recomendado. Ao invés disso, você deve passar a opção utf8=true quando montar suas partições FAT. Para mais informações, veja man mount e a documentação do kernel em /usr/src/linux/Documentation/filesystems/vfat.txt.

Para mudar a codificação dos nomes de arquivos, app-text/convmv pode ser usado.

# emerge --ask app-text/convmv
(Formato de comando)
# convmv -f <codificação-atual> -t utf-8 <nomedoarquivo>
(Troque iso-8859-1 com o conjunto de caracteres a partir do qual você
está convertendo)
# convmv -f iso-8859-1 -t utf-8 nomedoarquivo

Para mudar o conteúdo dos arquivos, use o utilitário iconv, que vem com o glibc:

(troque iso-8859-1 com o conjunto de caracteres a partir do qual você está convertendo)
(Veja se a saída é o esperado)
# iconv -f iso-8859-1 -t utf-8 nomedoarquivo 
(Converta um arquivo, você deve criar outro arquivo)
# iconv -f iso-8859-1 -t utf-8 nomedoarquivo > novoarquivo

app-text/recode também pode ser usado para este propósito.

O console de sistema Você precisa de >=sys-apps/baselayout-1.11.9 para Unicode no console.

Para ativar UTF-8 no console, você deve editar o /etc/rc.conf e configurar UNICODE="yes", e também ler os comentários no arquivo -- é importante ter uma fonte que tem um bom alcance de caracteres se você planeja tirar proveito do Unicode.

A variável KEYMAP, ajustada em /etc/conf.d/keymaps, deve ter um mapa de teclado de Unicode especificado.

(Troque "uk" pelo seu arranjo local)
KEYMAP="uk"
Ncurses e Slang Ignore qualquer menção de Slang nesta seção se você não o tem instalado ou não o usa.

É sábio adicionar unicode nas suas opções de USE globais em /etc/make.conf, e fazer novo emerge de sys-libs/ncurses e sys-libs/slang, caso necessário. O Portage irá fazer isto automaticamente quando você atualizar seu sistema:

# emerge --update --deep --newuse world

Nós também precisamos re-construir pacotes que ligam a estes, agora que as opções de USE foram aplicadas. A ferramenta que nós usamos (revdep-rebuild) é parte do pacote gentoolkit.

# revdep-rebuild --soname libncurses.so.5
# revdep-rebuild --soname libslang.so.1
KDE, GNOME e Xfce

Todos principais ambientes de desktop tem suporte total a Unicode, e não precisarão configurar mais do que já foi coberto neste guia. Isto é porque os toolkits gráficos (Qt ou GTK+2) são cientes de UTF-8. Subseqüentemente, todas aplicações rodando em cima dos toolkits devem ser cientes de UTF-8 sem ajustes adicionais.

As exceções à regra estão em Xlib e GTK+1. O GTK+1 precisa de uma FontSpec iso-10646-1 no ~/.gtkrc, por exemplo -misc-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1. Também, aplicações que usam Xlib ou Xaw precisarão de uma FontSpec semelhante, caso contrário não irão funcionar.

Se você tiver uma versão do control center do gnome1, use-o ao invés disso. Escolha qualquer fonte de iso10646 de lá.
style "user-font"
{
    fontset="-misc-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1"
}
widget_class "*" style "user-font"

Se uma aplicação tiver suporte tanto para uma GUI de Qt quanto de GTK+2, a GUI de GTK+2 irá geralmente dar melhores resultados com Unicode.

X11 e fontes x11-base/xorg-x11 tem suporte de fontes para Unicode muito melhor que XFree86 e é muito recomendável.

Fontes TrueType têm suporte para Unicode, e maior parte das fontes que vêm com o Xorg tem suporte de caracteres impressionante, embora, obviamente, nem todo glifo disponível em Unicode tenha sido criado para aquela fonte. Para construir fontes (incluindo o conjunto Bitstream Vera) com suporte para letras do leste asiáticos para X, certifique-se que você tem a opção de USE cjk ativa. Muitas outras aplicações usam a opção, então é uma boa idéia tê-la como uma opção permanente.

Também, vários pacotes de fonte no Portage são cientes de Unicode.

# emerge terminus-font intlfonts freefonts cronyx-fonts corefonts
Gerenciadores de janela e emuladores de terminal

Gerenciadores de janela não construídos com GTK ou Qt geralmente tem suporte muito bom a Unicode, já que freqüentemente usam a biblioteca Xft para lidar com fontes. Se seu gerenciador de janelas não usar Xft para fontes, você ainda pode usar a FontSpec mencionada na seção anterior como uma fonte de Unicode.

Emuladores de terminal que usam Xft e suportam Unicode são mais difíceis de aparecer. Fora o Konsole o gnome-terminal, as melhores opções no Portage são x11-terms/rxvt-unicode, xfce-extra/terminal, gnustep-apps/terminal, x11-terms/mlterm, ou simplesmente x11-terms/xterm quando construídos com a opção de USE unicode e invocados com uxterm. app-misc/screen também suporta UTF-8, quando invocada com screen -U ou quando o seguinte é colocado no ~/.screenrc:

defutf8 on
Vim, Emacs, Xemacs e Nano

O Vim fornece suporte completo de UTF-8, e também tem detecção interna de arquivos UTF-8. Para mais informações sobre o Vim, use :help mbyte.txt.

O Emacs 22.x e superiores também têm suporte completo e UTF-8. O Xemacs 22.x ainda não suporta combinação de caracteres.

As versões inferiores de Emacs e/ou Xemacs podem necessitar que você instale app-emacs/mule-ucs e/ou app-xemacs/mule-ucs e adicione o seguinte código em seu ~/.emacs para ter suporte a línguas CJK em UTF-8:

(require 'un-define)
(require 'jisx0213)
(set-language-environment "Japanese")
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)

Atualmente o nano não fornece suporte de UTF-8, embora já esteja planejado por bastante tempo. Com sorte, isto mudará no futuro. Na época desta escrita, suporte de UTF-8 está no CVS do nano, e deve ser incluído no próximo lançamento.

Shells

Atualmente, bash fornece suporte total de Unicode a través da biblioteca GNU readline. Usuários de Z Shell estão em uma posição um pouco pior -- nenhuma parte da shell tem suporte a Unicode, embora haja um esforço para adicionar suporte a conjuntos de caracteres de múltiplos bits no momento.

A C shell, tcsh e ksh não têm nenhum suporte de UTF-8.

Irssi

Irssi tem suporte completo de UTF-8, embora precise de que o usuário configure uma opção.

/set term_type UTF-8

Para canais onde caracteres não-ASCII são freqüentemente trocados em conjuntos de caracteres não-UTF-8, o comando /recode pode ser usado para converter os caracteres. Digite /help recode para mais informações.

Mutt

O agente de e-mail de usuário Mutt também tem bom suporte a Unicode. Para usar UTF-8 com o Mutt, você não precisa colocar nada em seus arquivos de configuração. O Mutt irá funcionar em um ambiente unicode sem modificação se todos seu arquivos (inclusive a assinatura) estiverem codificados em UTF-8.

Você pode ainda ver '?' em correio que você ler com Mutt. Isto é o resultado de pessoas que usam um cliente de correio que não indica o código de caracteres usado. Você não pode fazer mais que pedir para que configurem seu cliente corretamente.

Mais informações estão disponíveis no Mutt Wiki.

Less

Nós usamos muito more ou less junto com | para poder ver a saída de um comando corretamente, como para o exemplo dmesg | less. Embora o more só precise do shell para compreender UTF-8, o less precisa de uma variável de ambiente configurada, LESSCHARSET para certificar que os caracteres de unicode são desenhados corretamente. Isto pode ser configurado em /etc/profile ou ~/.bash_profile. Abra o editor de sua escolha e adicione a seguinte linha a um dos arquivos mencionados acima.

LESSCHARSET=utf-8
Man

Páginas de man são uma parte integral de qualquer máquina rodando Linux. Para ter certeza de que qualquer unicode em suas páginas de man sejam desenhados corretamente, edite /etc/man.conf e troque uma linha como mostrado abaixo.

(Esta é a linha velha)
NROFF           /usr/bin/nroff -Tascii -c -mandoc
(Troque a linha com esta)
NROFF           /usr/bin/nroff -mandoc -c
elinks e links

Estes dois são navegadores de texto comumente usados, e veremos como podemos ativar suporte a UTF-8 neles. No elinks e no links, existem dois jeitos de fazê-lo, um usando a opção Setup de dentro do navegador ou editando o arquivo de configuração. Para configurar a opção através do navegador, abra um site com elinks ou links e aperte Alt+S para entrar no Setup Menu e selecione Terminal options, ou aperte T. Desça e selecione a última opção UTF-8 I/O apertando Enter. Então salve e saia do menu. No links você pode ter que repetir Alt+S e apertar S para salvar. A opção do arquivo de configuração é mostrada abaixo.

(Para elinks, edite /etc/elinks/elinks.conf ou ~/.elinks/elinks.conf e
adicione a linha seguinte)
set terminal.linux.utf_8_io = 1

(Para links, edite ~/.links/links.cfg e adicione a seguinte
linha)
terminal "xterm" 0 1 0 us-ascii utf-8
Testando tudo

Existem vários websites para teste de UTF-8. net-www/w3m, net-www/links, net-www/elinks, net-www/lynx e todos navegadores baseados no Mozilla (incluindo o Firefox) têm suporte a UTF-8. O Konqueror e Opera também têm suporte completo a UTF-8.

Quando estiver usando um dos navegadores da web somente de texto, tenha certeza de que você está usando um terminal ciente de Unicode.

Se você vir certos caracteres exibidos como caixas com letras ou números dentro, isto significa que a sua fonte não tem o caractere ou glifo para o símbolo que o UTF-8 deseja. No caso, ele mostra uma caixa com o código hexadecimal do símbolo em UTF-8.

  • Uma página de teste de UTF-8 da W3C
  • Uma página de teste de UTF-8 fornecida pela Universidade de Frankfurt
Métodos de entrada

Dead keys pode ser usado para digitar caracteres no X que não são incluídos no seu teclado. Eles funcionam apertando a tecla Alt (ou em alguns países, AltGr) e uma tecla opcional da seção não-alfabética do teclado à esquerda da tecla de enter uma vez, soltando elas, e pressionando uma letra. A dead key deve modificá-la. A entrada pode ser modificada mais ainda usando a tecla Shift apertando ao mesmo tempo AltGr e um modificador.

Para ativar dead keys no X, você precisa de um arranjo que o suporte. A maior parte dos arranjos europeus têm dead keys como uma variante padrão. No entanto, isto não vale para arranjos norte-americanos. Embora haja um grau de inconsistência entre os arranjos, a solução mais fácil parece ser usar um arranjo na forma "en_US" ao invés de "us", por exemplo. O arranjo é configurado no /etc/X11/xorg.conf desta maneira:

Section "InputDevice"
    Identifier "Keyboard0"
    Driver     "kbd"
    Option     "XkbLayout" "en_US" # Ao invés de só "us"
    (Outras opções de Xkb aqui)
EndSection
A mudança precedente só precisa ser aplicada se você estiver usando um arranjo norte-americano, ou outro arranjo que não funciona com dead keys. Usuários europeus devem ter suas dead keys funcionando sem modificações.

Está mudança entrará em efeito quando seu servidor de X for reiniciado. Para aplicar a mudança agora, use a ferramenta setxkbmap, por exemplo, setxkbmap en_US.

É provavelmente mais fácil descrever dead keys com exemplos. Embora os resultados dependam do locale, os conceitos devem permanecer os mesmos independente do locale. Os exemplos contêm UTF-8, então para vê-los você precisa ou falar para seu navegador ver a página como UTF-8, ou já ter um locale de UTF-8 configurado.

Quando aperto AltGr e [ juntos, solto-os, e então aperto a, 'ä' é produzido. Quando aperto AltGr e [ juntos, solto-os, e então aperto e, 'ë' é produzido. Quando aperto AltGr e ; juntos, 'á' é produzido, quando aperto AltGr e ; juntos, solto-os, e aperto e, 'é' é produzido.

Ao apertar AltGr, Shift e [ juntos, soltá-los, e apertar a, um 'å' escandinavo é produzido. De maneira semelhante, quando aperto AltGr, Shift e [ juntos, solto o [, e aperto-o novamente, um '˚' é produzido. Embora pareça-se com um, este símbolo (U+02DA) não é igual ao símbolo de graus (U+00B0). Isto funciona com outros acentos produzidos por dead keys — AltGr e [, soltando só o [, apertando-o novamente e tendo '¨'.

AltGr pode ser usado com teclas alfabéticas sozinhas. Por exemplo, AltGr e m, uma letra grega minúscula mu é produzida: 'µ'. AltGr e s produzem um scharfes s ou esszet: 'ß'. Como muitos usuários europeus esperam (já que está marcado em seus teclados), AltGr e 4 (ou E dependendo do arranjo do teclado) produzem um símbolo do Euro, '€'.

Recursos
  • Entrada da Wikipedia para Unicode
  • Entrada da Wikipedia para UTF-8
  • Unicode.org
  • UTF-8.com
  • RFC 3629
  • RFC 2277
  • Characters vs. Bytes