Почему Windows отображается по-разному в Windows и Linux даже при использовании UTF-8? - PullRequest
2 голосов
/ 07 октября 2008

Почему в Linux по сравнению с Windows отображается следующее:

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

в Windows:

¿

в Linux:

¿

Ответы [ 5 ]

15 голосов
/ 07 октября 2008

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");
8 голосов
/ 07 октября 2008

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

(0xc2,0xbf)

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

0xbf,

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

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

6 голосов
/ 07 октября 2008

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

Для gnome-терминала в Ubuntu - перейдите в меню «Терминал» и выберите «Установить кодировку символов».

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

2 голосов
/ 07 октября 2008

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

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 голос
/ 07 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...