Как правильно настроить кодировку по умолчанию, используемую программным обеспечением 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>