Почему в Linux и Windows не отображается другое?Почему при использовании UTF-8 в Windows vs Linux отличается от других?
System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));
в Windows:
¿
в Linux:
¿
Почему в Linux и Windows не отображается другое?Почему при использовании UTF-8 в Windows vs Linux отличается от других?
System.out.println(new String("¿".getBytes("UTF-8"), "UTF-8"));
в Windows:
¿
в Linux:
¿
System.out.println() выводит текст в системной кодировке по умолчанию, но консоль интерпретирует этот вывод в соответствии с его собственной настройкой кодирования (или «кодовой страницы»). На вашей машине Windows эти два кодировки, похоже, совпадают, но в ящике Linux вывод, по-видимому, находится в UTF-8, а консоль декодирует его как однобайтную кодировку, такую как ISO-8859-1. Или, может быть, как предложил Джон, исходный файл сохраняется как UTF-8, а javac
читает его как что-то еще, что можно избежать, используя escape-последовательности Unicode.
Если вам нужно вывести что-либо кроме текста ASCII, лучше всего записать его в файл с использованием соответствующей кодировки, а затем прочитать файл с помощью текстового редактора - консоли слишком ограничены и слишком зависят от системы. Кстати, этот бит кода:
new String("¿".getBytes("UTF-8"), "UTF-8")
... не влияет на выход. Все, что делает, кодирует содержимое строки в массив байтов и декодирует ее снова, воспроизводя исходную строку - дорогостоящий no-op. Если вы хотите выводить текст в определенной кодировке, вам необходимо использовать OutputStreamWriter, например:
FileOutputStream fos = new FileOutputStream("out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
Трудно точно знать, какие байты ваш исходный код содержит, или который GetBytes строка () вызывается из-за вашего кодирования редактора и компилятора.
Можете ли вы создать короткую, но полную программу, содержащую только ASCII (и соответствующее \ uxxxx экранирование в строке), которое все еще показывает проблему?
Я подозреваю, что проблема может быть связана с выходом консоли на Windows или Linux, но было бы полезно сначала получить воспроизводимую программу.
Не знаете, где проблема точно, но стоит отметить, что
¿ (0xc2,0xbf)
является результатом кодирования с UTF-8
0xbf,
, который является кодовым номером Unicode для ¿
Итак, похоже, что в случае с linux вывод не отображается как utf-8, а как однобайтная строка g
Проверьте, что кодировка вашего терминала linux.
Для gnome-терминала в ubuntu - перейдите в меню «Terminal» и выберите «Set Character Encoding».
Для шпатлевки, Конфигурация -> Окно -> Перевод -> UTF-8 (и если это не работает, см. this post).
Выполнить этот код, чтобы помочь определить, является ли компилятор или консольный вопрос:
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();
}
Если закодированные байт для UTF-8 различны для каждой платформы (она должна быть c2bf), то проблема компилятора.
Если это проблема с компилятором, замените «¿» на "\u00bf".
+1. Недавно я увидел , отображаемый как C2A0 и пошел wtf. – Amarghosh 2009-12-15 16:29:28