Linux更新后JVM中的文件编码错误 [英] Wrong File Encoding in JVM after Linux Update
问题描述
新的操作系统版本。不幸的是,我不知道以前的版本了。但是我可以告诉你,更新错了。我的Collegue首先使用x32操作系统版本更新,然后我们重新安装了x64版本。
> uname -a
Linux <主机名> 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测试
ANSI_X3.4-1968
> LANG = de_DE.ISO8859-1 java测试
ANSI_X3.4-1968
> java -Dfile.encoding = ISO8859-1测试
ISO8859-1
至少c程序获取正确的编码,不要使用ANSI_X3.4-1968
> idn --debug --quieta.de
Charset`ISO-8859-1'。有没有人知道,如果有任何jvm具体的设置,那么这个bvb
$ b
<可能会在操作系统或java更新过程中丢失。
任何帮助赞赏。
感谢icza。我对JAVA_OPTS google了一下,发现我应该使用JAVA_TOOL_OPTIONS。
请参阅如何使用JAVA_OPTS环境变量?
或_JAVA_OPTIONS:
使用JAVA_OPTS env变量运行java
两者都运行正常,运行时和编译器
> export JAVA_TOOL_OPTIONS = -Dfile.encoding = ISO8859-1
> java测试
拾取JAVA_TOOL_OPTIONS:-Dfile.encoding = ISO8859-1
ISO8859-1
> javac Test.java
拾取JAVA_TOOL_OPTIONS:-Dfile.encoding = ISO8859-1
> ; export _JAVA_OPTIONS = -Dfile.encoding = ISO8859-1
> java Test
Picked _JAVA_OPTIONS:-Dfile.encoding = ISO8859-1
ISO8859-1
> javac Test.java
Picked _JAVA_OPTIONS:-Dfile.encoding = ISO8859-1
After updating linux and java (1.6.0.13->1.6.0.45), Java processes use different file encoding (System Property file.encoding)
New OS Version. Unfortunately I don't know the previous version anymore. But I can tell, that the update got wrong. My Collegue first updated using the x32 OS Version and then we reinstalled x64 Version.
>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 Settings
>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=
test program
public class Test
{
public static void main(String[] args)
{
System.out.println(System.getProperty("file.encoding"));
}
}
If I start this test program it returns ANSI_X3.4-1968. On other machines with same locale settings it returns ISO8859-1. Even if i start with explicit environment variable it remains unchanged. The only working solution is to use the -Dfile.encoding option. But I don't want to adjust all scripts that use java (tomcat, maven, ant, hudson....). I want to restore the old behaviour, that the file encoding in Java programms, was retrieved from the system locale definition.
>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
At least c programs get the correct encoding and do not use ANSI_X3.4-1968
>idn --debug --quiet "a.de"
Charset `ISO-8859-1'.
....
Does anybody know, if there is any jvm specific setting, that might got lost during OS or java update.
Any help appreciated.
thanks to icza. I googled a little for JAVA_OPTS, and found, that i should use JAVA_TOOL_OPTIONS instead. see How do I use the JAVA_OPTS environment variable?
or _JAVA_OPTIONS: Running java with JAVA_OPTS env variable
both are working just fine, for runtime and compiler
>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
这篇关于Linux更新后JVM中的文件编码错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!