Проблема с кодировкой 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 он работает правильно..
короче говоря, не используйте-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
. Это должно решить вашу проблему.