Posts com a Tag ‘acentuação’

Problemas com a codificação dos caracteres e acentuação no modo texto do Ubuntu 8.04

terça-feira, 13 de maio de 2008

Após atualizar o Ubuntu para a versão 8.04 resolvi implementar um multiterminal em casa. Precisei usar o modo texto (ctrl+alt+f1 acessa o modo texto e ctrl+alt+f7 retorna para o modo gráfico) já que iria testar diversas configurações do X. Infelizmente me deparei com dois problemas:

  1. Os caracteres acentuados não estavam sendo exibidos corretamente; e
  2. Os acentos no teclado (abnt2, o teclado com ç) não estavam funcionando.

Resolver o primeiro problema é simples: basta executar (no terminal, pode ser o gráfico) o comando sudo dpkg-reconfigure console-setup, responder as perguntas (em geral, a opção selecionada) e escolher o conjunto de caracteres ‘# Latin1 e Latin5 – línguas da Europa ocidental e turcas’.

O segundo problema é mais chato de ser resolvido. É provável que se trate de um bug, vou dar mais uma estudada e, se for o caso, reportar no launchpad. O pacote console-setup deveria substituir os pacotes console-common e console-data, mas como o esquema do teclado não está funcionado com o console-setup, o jeito é instalar estes pacotes. Para instalar os pacotes console-data e console-common, execute no terminal o comando sudo aptitude install console-common console-data. Durante a configuração dos pacotes escolha a opção ‘Não tocar no mapa de teclado’. Em seguida, configure o pacote console-data para usar o mapa de teclado correto, execute sudo dpkg-reconfigure console-data, escolha as opções ‘Selecionar mapa de teclado da lista de arquiteturas’, ‘qwerty’, ‘Brazilian’, ‘Standard’. Agora, copie o mapa do teclado do pacote console-data para ser usado pelo console-setup, execute o comando sudo cp /etc/console/boottime.kmap.gz /etc/console-setup/boottime.kmap.gz. Por fim, é necessário atualizar o initramfs usado pelo kernel, execute o comando sudo update-initramfs -u. Reinicie o computador e o problema deve ser resolvido.

Para reverter estas alterações, isto é, fazer como que o pacote console-setup volte a usar seu próprio mapa de teclado e não o do pacote console-data, remova o arquivo /etc/console-setup/boottime.kmap.gz e reconfigure o pacote console-setup.

Problemas com acentuação em programas java no prompt de comando do Windows

quarta-feira, 7 de novembro de 2007

Quem já executou um programa java no console (prompt de comando) do Windows provavelmente já conhece o problema: algumas letras acentuadas não aparecem corretamente. O problema é antigo e o pessoal da Sun já disse que não vai arrumar, veja bug, bug, bug.

Este problema acontece porque o Windows separa a codificação do console (OEM por padrão) da codificação das demais aplicações (ANSI por padrão). Quando a máquina virtual java é iniciada ela assume a codificação das demais aplicações e não a do console.

Vamos usar o código a seguir para ver como isso tudo funciona:

1
2
3
4
5
6
7
8
9
10
11
public class Acentos {
    public static void main(String[] args) {
        System.out.println("file.encoding=" + System.getProperty("file.encoding"));
        System.out.println("aàáâã");
        System.out.println("eèéê");
        System.out.println("iìí");
        System.out.println("oòóôõ");
        System.out.println("uùúü");
        System.out.println("cç");
    }
}

Ao compilar e executar o código temos o seguinte resultado:

Console imprimindo acentos com duas codificações diferentes

O comando chcp exibe a codificação usada no console, que no caso é 850 (ou Cp850, de CodePage). Na linha 3 é impresso a codificação que o java está utilizando, no caso Cp1252. Como as codificações são diferentes algumas letras acentuadas são não aparecem corretamente. Para resolver o problema temos que fazer as codificações coincidirem. Neste caso existe duas opções, alterar a codificação do console ou disser para o java utilizar outra codificação. A segunda solução é rápida e direta, basta mudar o valor da propriedade file.encoding para cp850. Esta opção não é muito robusta pois exige a mudança na chamada do java para todos os programas.

A outra opção é mudar a codificação do console, isto pode ser feito com o comando chcp 1252. Para esta solução funcionar é preciso alterar a fonte do console. Clique no ícone no canto superior esquerdo da janela do console, selecione “Propriedades” e altere a fonte para “Lucida Console”. Veja o resultado abaixo.

Console imprimindo acentos com duas codificações diferentes 2

Para torna a alteração da fonte permanente, clique no ícone no canto superior esquerdo da janela do console, e selecione “Padrão”. Feche o console e abra novamente e você verá que a fonte foi alterada, no entanto, ao executar o comando chcp a codificação ainda continua sendo 850. Para mudar a codificação do console é preciso editar o registro, procure a chave \HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\CodePage\OEMCP e altere o valor para 1252. Reinicie o computador e pronto!

Editando o registro do windows para alterar OEMCP para 1252

Não quis comentar inicialmente, mas ainda existe uma outra solução, que além de acabar com este problema resolve diversos outros: trocar o Windows pelo Ubuntu!