System.out.println () выводит текст в кодировке системы по умолчанию, но консоль интерпретирует этот вывод в соответствии со своей настройкой кодировки (или «кодовой страницы»). На вашей машине с Windows эти две кодировки, кажется, совпадают, но на коробке Linux вывод, по-видимому, в UTF-8, в то время как консоль декодирует его как однобайтовую кодировку, как ISO-8859-1. Или, может быть, как предположил Джон, исходный файл сохраняется как UTF-8, а javac
читает его как что-то еще, проблемы, которую можно избежать с помощью экранирования Unicode.
Когда вам нужно вывести что-либо, кроме текста ASCII, лучше всего записать его в файл с использованием соответствующей кодировки, а затем прочитать файл с помощью текстового редактора - консоли слишком ограничены и слишком зависят от системы. Кстати, этот бит кода:
new String("¿".getBytes("UTF-8"), "UTF-8")
... не влияет на вывод. Все, что делает, это кодирует содержимое строки в байтовый массив и снова декодирует ее, воспроизводя исходную строку - дорогостоящее бездействие. Если вы хотите выводить текст в определенной кодировке, вам нужно использовать OutputStreamWriter, например так:
FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");