Posts com a Tag ‘acentos’

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!