Por que é ¿exibidas diferente no Windows vs Linux mesmo quando se usa UTF-8?

votos
2

Porque é o seguinte exibidas diferente no Linux vs do Windows?

System.out.println(new String(¿.getBytes(UTF-8), UTF-8));

no Windows:

¿

em Linux:

UMA

Publicado 06/10/2008 em 22:06
fonte usuário
Em outras línguas...                            


5 respostas

votos
15

System.out.println () envia o texto na codificação padrão do sistema, mas o console interpreta que a produção de acordo com sua configuração própria codificação (ou "página de códigos"). Na sua máquina Windows as duas codificações parecem corresponder, mas na caixa de Linux a saída é aparentemente em UTF-8, enquanto a consola está a descodificar-lo como uma codificação de byte único como ISO-8859-1. Ou talvez, como Jon sugerido, o arquivo de origem está sendo salvo como UTF-8 e javacestá lendo-o como algo mais, um problema que pode ser evitado usando Unicode escapa.

Quando você precisa qualquer coisa saída diferente de texto ASCII, a sua melhor aposta é a de escrevê-lo em um arquivo usando uma codificação apropriada, em seguida, ler o arquivo com um editor de texto - consoles são muito limitado e muito dependente do sistema. By the way, este pedaço de código:

new String("¿".getBytes("UTF-8"), "UTF-8")

... não tem efeito sobre a saída. Tudo o que faz é codificar o conteúdo da string para um array de bytes e decodificá-lo novamente, reproduzindo a string original - um caro não-op. Se você quiser texto de saída em uma codificação específica, você precisará usar um OutputStreamWriter, assim:

FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
Respondeu 07/10/2008 em 00:49
fonte usuário

votos
8

Não tenho certeza onde o problema é exatamente, mas é importante notar que

ÿ (0xc2,0xbf)

é o resultado de codificação com UTF-8

0xBF,

que é o ponto de código Unicode para ¿

Assim, parece que no caso linux, a saída não está sendo exibido como utf-8, mas como uma seqüência de byte único

Respondeu 06/10/2008 em 22:19
fonte usuário

votos
6

Verifique qual codificação seu terminal linux tem.

Para gnome-terminal no Ubuntu - vá para o menu "Terminal" e selecione "Definir Codificação de caracteres".

Por massa de vidraceiro, Configuração -> Janela -> Tradução -> UTF-8 (e se isso não funcionar, consulte este post ).

Respondeu 06/10/2008 em 22:20
fonte usuário

votos
2

Executar este código para ajudar a determinar se é um problema de compilador ou console:

public static void main(String[] args) throws Exception {
    String s = "¿";
    printHex(Charset.defaultCharset(), s);

    Charset utf8 = Charset.forName("UTF-8");
    printHex(utf8, s);
}

public static void printHex(Charset encoding, String s)
        throws UnsupportedEncodingException {
    System.out.print(encoding + "\t" + s + "\t");

    byte[] barr = s.getBytes(encoding);
    for (int i = 0; i < barr.length; i++) {
        int n = barr[i] & 0xFF;
        String hex = Integer.toHexString(n);
        if (hex.length() == 1) {
            System.out.print('0');
        }
        System.out.print(hex);
    }
    System.out.println();
}

Se os bytes codificados para UTF-8 são diferentes em cada plataforma (que deve ser c2bf ), é uma questão compilador.

Se é uma questão de compilador, substitua "¿" com "\ u00bf" .

Respondeu 06/10/2008 em 22:34
fonte usuário

votos
1

É difícil saber exatamente quais bytes seu código-fonte contém, ou a corda que getBytes () está sendo chamado, devido ao seu editor e compilador codificações.

você pode produzir um programa curto, mas completo contendo apenas ASCII (eo relevante \ uxxxx escapar na string), que ainda mostra o problema?

Eu suspeito que o problema pode muito bem ser com a saída do console no Windows ou Linux, mas seria bom ter um programa reprodutível em primeiro lugar.

Respondeu 06/10/2008 em 22:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more