Por que é ¿exibidas diferente no Windows vs Linux mesmo quando se usa UTF-8?
-
05-07-2019 - |
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:
ÿ
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.