Linux更新后JVM中的文件编码错误 [英] Wrong File Encoding in JVM after Linux Update

查看:195
本文介绍了Linux更新后JVM中的文件编码错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



新的操作系统版本。不幸的是,我不知道以前的版本了。但是我可以告诉你,更新错了。我的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆