Учитывая следующую среду:
- Windows 10
- Язык установлен на японский
- Язык для программ, не поддерживающих Юникод, установлен на японский
- Java-программа запускается на консоли
После выполнения возникает исключение IOException, и сообщение, ожидаемое в консоли, выглядит следующим образом: 既存 の 接 続 続 は 的 的 的 的 的 的 的 的 し し し し。 (Переводится как «Существующее соединение было принудительно закрыто удаленным хостом»). См. Фрагмент кода ниже:
private void onIOException(IOException e, AbstractConnection connection)
{
String reason = e.getMessage();
...
log.error("Closing ",connection," because ",reason);
}
При работе в Java 8 сообщение печатается правильно.Однако при запуске в Java 9 сообщение печатается как as 「蟄 倥? ョ 謗 ・ 邯 壹? ッ 繝 ェ 繝「 繝 繝 繝?繝 帙 せ 繝 医 ↓ 蠑 キ 蛻 カ 逧? 縺 ォ 蛻? 譁 ュ 縺 輔 л 縺 セ 縺 励 ◆ 縲?
После некоторого исследования, было установлено, что в Java 9, байтовый массив, используемый для представления того жеСтрока содержит другой набор значений ([-24, -83, -116, -17, -67, ...]).В Java 8 строка раньше представлялась в байтах как ([-26, -105, -94, -27, -83, ...]).В Java 9, если мы создаем строку с использованием байтового массива, используемого в Java 8, сообщение печатается правильно.По-видимому, это также вызвано компактными строками, поскольку строки больше не хранятся в виде массивов символов.
Мы попробовали следующее:
- с использованием системного свойства java.locale.providers
- с использованием системного свойства file.encoding
- с использованием консольной команды chcp с различными значениями
- отключение компактных строк с помощью "-XX: -CompactStrings"
Мы также пробовали комбинации, но безрезультатно.
Это связано с предыдущим вопросом Сообщение IOException не печатается правильно при использовании Java 9 в Windows 10 с установленным языком и языком Японии также (я не могу добавить детали через комментарий или ответ).
У кого-нибудь есть идеи по этому вопросу?Спасибо!