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

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

Я считал это -Dfile.encoding=whatever используемый, чтобы быть способом пойти для более старого JVMs... У меня нет той роскоши по причинам, в которые входят I привычек.

Я попробовал:

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());
342
задан user7 3 July 2019 в 17:53
поделиться

5 ответов

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

Как [1 110] Edward Grech указывает, в особом случае как это, переменная среды JAVA_TOOL_OPTIONS может использоваться для определения этого свойства, но это обычно делается как это:

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

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

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

293
ответ дан Community 23 November 2019 в 00:33
поделиться

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

18
ответ дан Marc Novakowski 23 November 2019 в 00:33
поделиться

Не ясный на том, что Вы делаете и не управлять в этой точке. Если можно вставить различный класс OutputStream на целевом файле, Вы могли бы использовать подтип OutputStream, который преобразовывает Строки в байты под набором символов, Вы определяете, говорите UTF-8 по умолчанию. Если изменено UTF-8 является suffcient для Ваших потребностей, можно использовать 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

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

1
ответ дан Dov Wasserman 23 November 2019 в 00:33
поделиться

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

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

38
ответ дан Jens 23 November 2019 в 00:33
поделиться

От JVMв „ў Интерфейс Инструмента к documentation†¦

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

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

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

165
ответ дан Edward Grech 23 November 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: