Pergunta

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

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

no Windows:

¿

no Linux:

ÿ

Foi útil?

Solução

System.out.println () envia o texto na codificação padrão do sistema, mas os interpreta de console 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 partida, mas no Linux caixa 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 javac é lê-lo como qualquer outra coisa, um problema que pode ser evitado pelo uso de escapes Unicode.

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 limitados e demasiado 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");

Outras dicas

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

ÿ (0xc2,0xbf)

é o resultado de codificar 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

Verifique qual codificação seu terminal linux tem.

Para gnome-terminal no Ubuntu -. Ir para o menu "Terminal" e selecione "Set codificação de caracteres"

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

Executar este código para ajudar a determinar se ele é um compilador ou consola de emissão:

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" .

É 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top