Установка кодировки символов Java по умолчанию

Как правильно настроить кодировку по умолчанию, используемую программным обеспечением JVM (1.5.x)?

Я читал, что -Dfile.encoding=whatever был тем, как идти на старшие JVM... У меня нет такой роскоши по причинам, по которым я не попаду.

Я пробовал:

System.setProperty("file.encoding", "UTF-8");

И свойство получает значение, но, по-видимому, он не вызывает окончательный вызов getBytes ниже для использования UTF8:

    System.setProperty("file.encoding", "UTF-8");

    byte inbytes[] = new byte[1024];

    FileInputStream fis = new FileInputStream("response.txt");
    fis.read(inbytes);
    FileOutputStream fos = new FileOutputStream("response-2.txt");
    String in = new String(inbytes, "UTF8");
    fos.write(in.getBytes());

Ответ 1

К сожалению, свойство file.encoding должно указываться при запуске JVM; к моменту ввода вашего основного метода кодировка символов, используемая String.getBytes() и конструкторы по умолчанию InputStreamReader и OutputStreamWriter, была постоянно кэширована.

Как Эдуард Греч указывает, в специальном случае, подобном этому, переменную окружения JAVA_TOOL_OPTIONS можно использовать для указания этого свойства, но обычно это делается так

java -Dfile.encoding=UTF-8 … com.x.Main

Charset.defaultCharset() будет отражать изменения в свойстве file.encoding, но большая часть кода в основных библиотеках Java, которые должны определять кодировку по умолчанию, не использует этот механизм.

Когда вы кодируете или декодируете, вы можете запросить свойство file.encoding или Charset.defaultCharset(), чтобы найти текущую кодировку по умолчанию, и использовать соответствующий метод или перегрузку конструктора, чтобы указать его.

Ответ 2

Из JVM ™ Tool Interface документация...

Поскольку в командной строке не всегда можно получить доступ или изменить, например, во встроенных виртуальных машинах или просто виртуальных машинах, запущенных глубоко внутри скриптов, предоставляется переменная JAVA_TOOL_OPTIONS, позволяющая запускать агентов в этих случаях.

Установив переменную среды (Windows) JAVA_TOOL_OPTIONS на -Dfile.encoding=UTF8, свойство (Java) System будет установлено автоматически при каждом запуске JVM. Вы узнаете, что параметр был поднят, потому что следующее сообщение будет отправлено на System.err:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

Ответ 3

У меня есть хакерский способ, который определенно работает!

System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

Таким образом вы собираетесь обмануть JVM, который думал бы, что набор символов не установлен и заставит его снова установить его на UTF-8 во время выполнения!

Ответ 4

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

Я лично считаю, что String.getBytes() должен быть устаревшим, поскольку он вызвал серьезные проблемы в ряде случаев, которые я видел, когда разработчик не учитывал кодировку по умолчанию, возможно, меняющуюся.

Ответ 5

Я не могу ответить на ваш первоначальный вопрос, но я хотел бы предложить вам несколько советов - не зависит от кодировки JVM по умолчанию. Всегда лучше явно указать желаемое кодирование (т.е. "UTF-8" ) в вашем коде. Таким образом, вы знаете, что он будет работать даже в разных системах и конфигурациях JVM.

Ответ 6

Попробуйте следующее:

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))

Ответ 7

У нас были те же проблемы. Мы методично попробовали несколько предложений из этой статьи (и других) безрезультатно. Мы также попытались добавить -Dfile.encoding=UTF8 но ничего не -Dfile.encoding=UTF8.

Для людей, которые имеют эту проблему, следующая статья, наконец, помогла нам отследить, описывает, как настройка локали может сломать unicode/UTF-8 в Java/Tomcat

http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat

Правильная настройка локали в файле ~/.bashrc сработала у нас.

Ответ 8

Если вы используете Spring Boot и хотите передать аргумент file.encoding в JVM, вы должны запустить его следующим образом:

mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"

это было необходимо для нас, поскольку мы использовали шаблоны JTwig, а операционная система имела ANSI_X3.4-1968, которую мы обнаружили через System.out.println(System.getProperty("file.encoding"));

Надеюсь, это поможет кому-то!

Ответ 9

Я пробовал много вещей, но образец кода здесь работает отлично. Ссылка

Суть кода:

String s = "एक गाव में एक किसान";
String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");

Ответ 10

Не понятно, что вы делаете и не контролируете на этом этапе. Если вы можете вставить другой файл OutputStream в файл назначения, вы можете использовать подтип OutputStream, который преобразует строки в байты под кодировкой, которую вы определяете, например, по умолчанию UTF-8. Если модифицированный UTF-8 является достаточным для ваших нужд, вы можете использовать DataOutputStream.writeUTF(String):

byte inbytes[] = new byte[1024];
FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
String in = new String(inbytes, "UTF8");
DataOutputStream out = new DataOutputStream(new FileOutputStream("response-2.txt"));
out.writeUTF(in); // no getBytes() here

Если этот подход невозможен, это может помочь, если вы четко разъясните, что именно вы можете и не можете контролировать с точки зрения потока данных и среды выполнения (хотя я знаю, что иногда проще сказать, чем определено). Удачи.

Ответ 11

mvn clean install -Dfile.encoding=UTF-8 -Dmaven.repo.local=/path-to-m2
Команда

работала с exec-maven-plugin для устранения следующей ошибки при настройке задачи jenkins.

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
Error occurred during initialization of VM
java.nio.charset.IllegalCharsetNameException: "UTF-8"
    at java.nio.charset.Charset.checkName(Charset.java:315)
    at java.nio.charset.Charset.lookup2(Charset.java:484)
    at java.nio.charset.Charset.lookup(Charset.java:464)
    at java.nio.charset.Charset.defaultCharset(Charset.java:609)
    at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:56)
    at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:111)
    at java.io.PrintStream.<init>(PrintStream.java:104)
    at java.io.PrintStream.<init>(PrintStream.java:151)
    at java.lang.System.newPrintStream(System.java:1148)
    at java.lang.System.initializeSystemClass(System.java:1192)

Ответ 12

Мы установили вместе два системных свойства, и это заставляет систему принимать все в utf8

file.encoding=UTF8
client.encoding.override=UTF-8

Ответ 13

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

"измените локаль базовой платформы перед запуском вашей Java-программы."

http://bugs.java.com/view_bug.do?bug_id=4163515

Для докера смотрите:

http://jaredmarkell.com/docker-and-locales/

Ответ 14

Недавно я столкнулся с локальной системой Notes 6.5 и выяснил, что веб-почта будет отображать неидентифицируемые символы на локальной установке Windows, отличной от Zhongwen. Вырыли в течение нескольких недель в Интернете, выяснили это всего несколько минут назад:

В свойствах Java добавьте следующую строку в параметры времени выполнения

-Dfile.encoding=MS950 -Duser.language=zh -Duser.country=TW -Dsun.jnu.encoding=MS950

В этом случае настройка UTF-8 не будет работать.

Ответ 15

Я использую Amazon (AWS) Elastic Beanstalk и успешно сменил его на UTF-8.

В эластичном бобовом стебле перейдите в "Конфигурация > Программное обеспечение", "Свойства среды". Добавить (имя) JAVA_TOOL_OPTIONS с (значением) -Dfile.encoding = UTF8

После сохранения среда перезапустится с кодировкой UTF-8.

Ответ 16

Моя команда столкнулась с той же проблемой на компьютерах с Windows.. затем удалось решить ее двумя способами:

a) Установить переменную окружения (даже в системных настройках Windows)

JAVA_TOOL_OPTIONS
-Dfile.encoding = UTF-8

б) Добавьте следующий фрагмент в ваш pom.xml:

 -Dfile.encoding=UTF-8 

В

 <jvmArguments>
 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8001
 -Dfile.encoding=UTF-8
 </jvmArguments>