在更新了Linux和Java(1.6.0.13-> 1.6.0.45)之后,Java进程使用不同的文件编码(系统属性文件编码)
新的操作系统版本。不幸的是,我不再知道以前的版本。但我可以告诉你,更新出了问题。我的同事首先使用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'.
....
有没有人知道,在操作系统或Java更新期间是否会丢失任何JVM特定设置。
感谢任何帮助。
JAVA_OPTS
),它们会在每次JVM启动时自动读取和应用。如果您无法找到并恢复原始编码,您可以通过这种方式为所有Java应用程序“永久”设置它。 - iczaJAVA_OPTS
,请参见https://dev59.com/Z3I-5IYBdhLWcg3wHUdB。 - icza