Проблема Java Charset в Linux - PullRequest
       12

Проблема Java Charset в Linux

10 голосов
/ 30 января 2010

проблема: у меня есть строка, содержащая специальные символы, которые я преобразую в байты, и наоборот .. преобразование работает правильно в windows, но в linux специальный символ не преобразуется должным образом. По умолчанию в Linux используется кодировка UTF-8с Charset.defaultCharset.getdisplayName ()

, однако, если я запускаю на linux с параметром -Dfile.encoding = ISO-8859-1, он работает правильно.

как заставить его работать, используяКодировка по умолчанию в UTF-8 и не задание опции -D в среде unix.

edit: я использую jdk1.6.13

edit: фрагмент кода работает с cs = "ISO-8859-1";или cs = "UTF-8";на победу, но не в Linux

        String x = "½";
        System.out.println(x);
        byte[] ba = x.getBytes(Charset.forName(cs));
        for (byte b : ba) {
            System.out.println(b);
        }
        String y = new String(ba, Charset.forName(cs));
        System.out.println(y);

~ привет да

Ответы [ 3 ]

10 голосов
/ 30 января 2010

Возможно, ваши персонажи испорчены процессом компиляции, и вы попали в ненужные данные в файле класса.

если я запускаю на linux с параметром -Dfile.encoding = ISO-8859-1, он работает правильно ..

Свойство file.encoding не требуется спецификацией платформы J2SE; это внутренняя деталь реализаций Sun и не должна проверяться или изменяться пользовательским кодом. Он также предназначен только для чтения; технически невозможно поддерживать установку этого свойства для произвольных значений в командной строке или в любое другое время во время выполнения программы.

Короче, не используйте -Dfile.encoding = ...

    String x = "½";

Поскольку U + 00bd (& # x00bd;) будет представлено разными значениями в разных кодировках:

windows-1252     BD
UTF-8            C2 BD
ISO-8859-1       BD

... вам нужно сообщить компилятору, какая кодировка вашего исходного файла кодируется как:

javac -encoding ISO-8859-1 Foo.java

Теперь перейдем к этому:

    System.out.println(x);

Как PrintStream , он будет кодировать данные в кодировку системы до передачи байтовых данных. Как это:

 System.out.write(x.getBytes(Charset.defaultCharset()));

Это может работать, а может и не работать на некоторых платформах - байтовая кодировка должна соответствовать кодировке, ожидаемой консолью для корректного отображения символов.

3 голосов
/ 30 января 2010

Ваша проблема немного расплывчата. Вы упомянули, что -Dfile.encoding решил вашу проблему с Linux, но фактически он используется только для информирования Sun (!) JVM, какую кодировку использовать для управления именами файлов / путями в локальной файловой системе диска. И ... это не вписывается в описание проблемы, которое вы дали буквально: «преобразование символов в байты и обратно в символы не удалось». Я не вижу, что -Dfile.encoding имеет к этому отношение. Там должно быть больше в истории. Как вы пришли к выводу, что это не удалось? Вы читали / записывали эти символы из / в путь / имя файла или около того? Или вы печатали на стандартный вывод? Использовал ли stdout правильную кодировку?

Тем не менее, почему вы хотите преобразовать символы вперед и назад в / из байтов? Я не вижу каких-либо полезных деловых целей для этого.

(извините, это не вписалось в комментарий, но я обновлю его ответом, если вы предоставите больше информации о фактическом функциональном требовании ).

Обновление: согласно комментариям: вам просто нужно настроить stdout / cmd, чтобы он использовал правильную кодировку для отображения этих символов. В Windows вы можете сделать это с помощью команды chcp, но есть одно важное предостережение: стандартные шрифты, используемые в Windows cmd, не имеют надлежащих глифов (фактических изображений шрифтов) для символов вне ISO-8859. кодировок. Вы можете взломать тот или другой в реестре , чтобы добавить правильные шрифты. Никаких формулировок о Linux, потому что я не делаю это широко, но похоже, что -Dfile.encoding - это какой-то путь. В конце концов ... я думаю, что лучше заменить cmd инструментом кроссплатформенного интерфейса для отображения символов так, как вы хотите, например Swing .

1 голос
/ 30 января 2010

Вы должны сделать преобразование явно:

byte[] byteArray = "abcd".getBytes( "ISO-8859-1" );
new String( byteArray, "ISO-8859-1" );

РЕДАКТИРОВАТЬ:

Кажется, что проблема в кодировке вашего Java-файла.Если это работает на Windows, попробуйте скомпилировать исходные файлы на Linux с javac -encondig ISO-8859-1.Это должно решить вашу проблему.

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