2008-10-06 9 views

ответ

15

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"); 
1

Трудно точно знать, какие байты ваш исходный код содержит, или который GetBytes строка () вызывается из-за вашего кодирования редактора и компилятора.

Можете ли вы создать короткую, но полную программу, содержащую только ASCII (и соответствующее \ uxxxx экранирование в строке), которое все еще показывает проблему?

Я подозреваю, что проблема может быть связана с выходом консоли на Windows или Linux, но было бы полезно сначала получить воспроизводимую программу.

8

Не знаете, где проблема точно, но стоит отметить, что

¿ (0xc2,0xbf)

является результатом кодирования с UTF-8

0xbf,

, который является кодовым номером Unicode для ¿

Итак, похоже, что в случае с linux вывод не отображается как utf-8, а как однобайтная строка g

+0

+1. Недавно я увидел  , отображаемый как C2A0 и пошел wtf. – Amarghosh 2009-12-15 16:29:28

6

Проверьте, что кодировка вашего терминала linux.

Для gnome-терминала в ubuntu - перейдите в меню «Terminal» и выберите «Set Character Encoding».

Для шпатлевки, Конфигурация -> Окно -> Перевод -> UTF-8 (и если это не работает, см. this post).

2

Выполнить этот код, чтобы помочь определить, является ли компилятор или консольный вопрос:

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

 Смежные вопросы

  • Нет связанных вопросов^_^