Проблема с кодировкой Java в linux

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

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

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

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

edit: фрагмент кода работает с cs = "ISO-8859-1"; или cs=" UTF-8"; на win, но не в 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);

~С уважением daed

3 ответов


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

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

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

короче говоря, не используйте-Dfile.кодирование.=..

    String x = "½";

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

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()));

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


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

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

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

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


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

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

EDIT:

Кажется, что проблема заключается в кодировке вашего java-файла. Если он работает в windows, попробуйте скомпилировать исходные файлы в linux с помощью javac -encondig ISO-8859-1. Это должно решить вашу проблему.