使用Java 9和日语区域设置时,控制台中的JVM异常消息未正确打印(可能是由于字符串紧凑)

时间:2019-07-02 09:01:04

标签: encoding character-encoding java-9

鉴于以下环境:

  • Windows 10
  • 语言设置为日语
  • 非unicode程序的语言设置为日语
  • Java程序在控制台上运行

执行后,遇到IOException,并且控制台中预期的消息如下:既存の接続はリリーートホストに强制的に切断されました。(翻译为“现有的连接被远程服务器强行关闭了。主机”),请参见下面的代码段:

private void onIOException(IOException e, AbstractConnection connection)
{
    String reason = e.getMessage();
    ...
    log.error("Closing ",connection," because ",reason);
}

在Java 8中运行时,消息将正确打印。 但是,当在Java 9中运行时,该消息将显示为?繝帙せ繝医↓蝾キ蜕カ逧?カ逧蜕縺ォ哗ュ縺辅l縺セ縺励◆缧?

经过一番调查,发现在Java 9中,用于表示相同字符串的字节数组包含一组不同的值([-24,-83,-116,-17,-67,... ])。在Java 8中,该字符串以前以字节表示为([--26,-105,-94,-27,-83,...])。在Java 9中,如果我们使用Java 8中使用的字节数组构造字符串,则消息将正确打印。这似乎也由紧凑的字符串引起,因为字符串不再存储为char数组。

我们尝试了以下方法:

  • 使用系统属性java.locale.providers
  • 使用系统属性file.encoding
  • 使用具有不同值的控制台命令chcp
  • 通过“ -XX:-CompactStrings”禁用紧缩字符串

我们也尝试过组合,但也无济于事。

这也与先前的问题IOException message not printed correctly when using Java 9 on Windows 10 set to Japan locale and language有关(我无法通过评论或答案添加详细信息)。

有人对这个问题有想法吗?谢谢!

0 个答案:

没有答案