java - Linux 更新后 JVM 中的错误文件编码

标签 java unix encoding locale

更新linux和java(1.6.0.13->1.6.0.45)后,Java进程使用不同的文件编码(System Property file.encoding)

新操作系统版本。不幸的是我不知道以前的版本了。但我可以说,更新出错了。我的同事首先使用 x32 操作系统版本进行更新,然后我们重新安装了 x64 版本。

>uname -a
Linux <hostname> 2.6.31.5-0.1-desktop #1 SMP PREEMPT 2009-10-26 15:49:03 +0100 x86_64 x86_64 x86_64 GNU/Linux

区域设置

>locale
LANG=en_US.ISO8859-1
LC_CTYPE=en_US.ISO8859-1
LC_NUMERIC="en_US.ISO8859-1"
LC_TIME="en_US.ISO8859-1"
LC_COLLATE="en_US.ISO8859-1"
LC_MONETARY="en_US.ISO8859-1"
LC_MESSAGES="en_US.ISO8859-1"
LC_PAPER="en_US.ISO8859-1"
LC_NAME="en_US.ISO8859-1"
LC_ADDRESS="en_US.ISO8859-1"
LC_TELEPHONE="en_US.ISO8859-1"
LC_MEASUREMENT="en_US.ISO8859-1"
LC_IDENTIFICATION="en_US.ISO8859-1"
LC_ALL=

测试程序

public class Test
{
  public static void main(String[] args)
  {
    System.out.println(System.getProperty("file.encoding"));
  }
}

如果我启动这个测试程序,它会返回 ANSI_X3.4-1968。在具有相同语言环境设置的其他机器上,它返回 ISO8859-1。即使我从显式环境变量开始,它也保持不变。唯一可行的解​​决方案是使用 -Dfile.encoding 选项。但是我不想调整所有使用java的脚本(tomcat、maven、ant、hudson....)。我想恢复旧行为,即从系统区域设置定义中检索 Java 程序中的文件编码。

>java Test
ANSI_X3.4-1968

>LANG=de_DE.ISO8859-1 java Test
ANSI_X3.4-1968

>java -Dfile.encoding=ISO8859-1 Test
ISO8859-1

至少c程序得到正确的编码并且不使用ANSI_X3.4-1968

>idn --debug  --quiet "a.de"
Charset `ISO-8859-1'.
....

有谁知道,如果有任何特定于 jvm 的设置,它可能会在操作系统或 java 更新期间丢失。

感谢任何帮助。

最佳答案

感谢 icza。我在谷歌上搜索了一些 JAVA_OPTS,发现我应该改用 JAVA_TOOL_OPTIONS。 见How do I use the JAVA_OPTS environment variable?

或 _JAVA_OPTIONS: Running java with JAVA_OPTS env variable

对于运行时和编译器,两者都工作得很好

>export JAVA_TOOL_OPTIONS=-Dfile.encoding=ISO8859-1
>java Test
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=ISO8859-1
ISO8859-1

>javac Test.java
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=ISO8859-1

>export _JAVA_OPTIONS=-Dfile.encoding=ISO8859-1
>java Test
Picked up _JAVA_OPTIONS: -Dfile.encoding=ISO8859-1
ISO8859-1

>javac Test.java
Picked up _JAVA_OPTIONS: -Dfile.encoding=ISO8859-1

关于java - Linux 更新后 JVM 中的错误文件编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548646/

相关文章:

git - 如何捕获 `git clone` 的完整输出?

string - 将 5 个字符的字符串编码为唯一且可重复的 32 位整数

java - 将对象数组发送到 WebService

java - hadoop 2.5.0 启动datanode失败

java - 单选按钮的 HttpServletRequest getParameter

java - 初始化实例变量的地方

linux - 有人可以帮助修复我的 vimrc 配置吗?

使用结构创建文件

python - 统一码编码错误 : 'ascii' codec can't encode character '\xf1' in position 61: ordinal not in range(128)

jquery - CURL 不编码 UTF-8