Как правильно установить кодировку символов по умолчанию, используемую 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());
java
utf-8
character-encoding
Вилли Ментцель
источник
источник
file.encoding
свойства не поддерживается .class Reader
&class Writer
)? Посколькуclass FileInputStream
это поток ввода-вывода, основанный на байтах, так почему нужно заботиться о наборе символов в потоке ввода-вывода на основе байтов?Ответы:
К сожалению,
file.encoding
свойство должно быть указано при запуске JVM; к моменту ввода вашего основного метода кодировка символов, используемая конструкторами поString.getBytes()
умолчаниюInputStreamReader
иOutputStreamWriter
постоянно кэшируемая.Как указывает Эдвард Греч, в особом случае, подобном этому, переменная окружения
JAVA_TOOL_OPTIONS
может использоваться для указания этого свойства, но обычно это делается так:Charset.defaultCharset()
будет отражать изменения вfile.encoding
свойстве, но большая часть кода в основных библиотеках Java, которые должны определять кодировку символов по умолчанию, не использует этот механизм.Когда вы кодируете или декодируете, вы можете запросить
file.encoding
свойство илиCharset.defaultCharset()
найти текущую кодировку по умолчанию и использовать соответствующий метод или перегрузку конструктора, чтобы указать его.источник
file.encoding
sysprop после запуска JVM.Из документации по интерфейсу инструмента JVM ™ …
Установив (Windows) переменной среды
JAVA_TOOL_OPTIONS
в-Dfile.encoding=UTF8
, то (Java)System
свойство устанавливается автоматически каждый раз , когда начинается JVM. Вы будете знать, что параметр был выбран, потому что следующее сообщение будет отправленоSystem.err
:источник
UTF8
илиUTF-8
?У меня есть хакерский способ, который определенно работает !!
Таким образом, вы собираетесь обмануть JVM, который подумает, что charset не установлен, и заставит его снова установить его в UTF-8 во время выполнения!
источник
WARNING: An illegal reflective access operation has occurred • WARNING: Illegal reflective access by [..] • WARNING: Please consider reporting this to the maintainers of [..] • WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations • WARNING: All illegal access operations will be denied in a future release
Я думаю, что лучший подход, чем установка набора символов по умолчанию для платформы, особенно если учесть, что у вас есть ограничения в отношении влияния на развертывание приложения, не говоря уже о платформе, состоит в том, чтобы назвать гораздо более безопасным
String.getBytes("charsetName")
. Таким образом, ваше приложение не зависит от не зависящих от него вещей.Лично я считаю, что это
String.getBytes()
следует считать устаревшим, так как это вызвало серьезные проблемы в ряде случаев, которые я видел, когда разработчик не учитывал возможное изменение кодировки по умолчанию.источник
Я не могу ответить на ваш оригинальный вопрос, но я хотел бы предложить вам несколько советов - не зависите от кодировки JVM по умолчанию. Всегда лучше явно указать желаемую кодировку (то есть "UTF-8") в вашем коде. Таким образом, вы знаете, что он будет работать даже в разных системах и конфигурациях JVM.
источник
Попробуй это :
источник
У нас были те же проблемы. Мы методично попробовали несколько предложений из этой статьи (и других) безрезультатно. Мы также попытались добавить
-Dfile.encoding=UTF8
и ничего не получалось.Для людей, которые испытывают эту проблему, в следующей статье , наконец , помогла нам выследить описывает , как региональные настройки могут привести к поломке
unicode/UTF-8
вJava/Tomcat
http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat
Правильная настройка локали в
~/.bashrc
файле сработала у нас.источник
Я много чего перепробовал, но пример кода здесь работает отлично. Ссылка на сайт
Суть кода:
источник
Если вы используете Spring Boot и хотите передать аргумент
file.encoding
в JVM, вы должны запустить его так:это было необходимо для нас, так как мы использовали
JTwig
шаблоны, и операционная система имелаANSI_X3.4-1968
то, что мы узнали черезSystem.out.println(System.getProperty("file.encoding"));
Надеюсь, это поможет кому-то!
источник
Я использую Amazon (AWS) Elastic Beanstalk и успешно изменил его на UTF-8.
В Elastic Beanstalk выберите Конфигурация> Программное обеспечение, «Свойства среды». Добавьте (имя) JAVA_TOOL_OPTIONS с (значение) -Dfile.encoding = UTF8
После сохранения среда перезапустится с кодировкой UTF-8.
источник
Непонятно, чем вы занимаетесь, и на данный момент у вас нет контроля. Если вы можете вставить другой класс OutputStream в целевой файл, вы можете использовать подтип OutputStream, который преобразует Strings в байты под определенным вами набором символов, скажем UTF-8 по умолчанию. Если модифицированного UTF-8 достаточно для ваших нужд, вы можете использовать
DataOutputStream.writeUTF(String)
:Если этот подход неосуществим, может помочь, если вы уточнить здесь, что именно вы можете и не можете контролировать с точки зрения потока данных и среды выполнения (хотя я знаю, что иногда это легче сказать, чем определить). Удачи.
источник
Команда работала с exec-maven-plugin для устранения следующей ошибки при настройке задачи jenkins.
источник
Мы устанавливаем два системных свойства вместе, и это заставляет систему принимать все в utf8
источник
После комментария @Caspar к принятому ответу предпочтительный способ исправить это в соответствии с Sun:
msgstr "изменить язык базовой платформы перед запуском вашей Java-программы."
http://bugs.java.com/view_bug.do?bug_id=4163515
Для докера см .:
http://jaredmarkell.com/docker-and-locales/
источник
Недавно я столкнулся с системой Notes 6.5 местной компании и обнаружил, что в веб-почте будут отображаться неидентифицируемые символы при установке Windows, не относящейся к Zhongwen. Покопались несколько недель в Интернете, разобрались всего несколько минут назад:
В свойствах Java добавьте следующую строку в Параметры времени выполнения
Настройка UTF-8 не будет работать в этом случае.
источник
Моя команда столкнулась с той же проблемой на машинах с Windows .. затем удалось решить ее двумя способами:
a) Установить переменную окружения (даже в системных настройках Windows)
JAVA_TOOL_OPTIONS
-Dfile.encoding = UTF8
б) Добавьте следующий фрагмент в ваш pom.xml:
В ПРЕДЕЛАХ
источник