後更新Linux和Java(1.6.0.13-> 1.6.0.45)之後,Java進程使用不同的文件編碼(系統屬性的file.encoding)錯誤的文件編碼在JVM的Linux更新
新的操作系統版本。不幸的是,我不知道以前的版本了。但我可以告訴,更新出錯了。我的Collegue首先使用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程序中的文件編碼。
>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的具體設置,可能OS或中迷路了java更新。
任何幫助表示讚賞。
作爲最後的手段,Java配置文件/環境變量('JAVA_OPTS')會自動讀取並應用於每個JVM啓動。如果您無法搜索並恢復原始編碼,則可以通過這種方式爲所有Java應用程序「永久」進行設置。 – icza 2014-08-28 12:37:51
你能否對Java配置文件更具體些?我不知道。 JAVA_OPS似乎不起作用。 export JAVA_OPTS = -Dfile.encoding = ISO-8859-15 java測試 ANSI_X3.4-1968。這對於javac編譯器設置無效,它也使用ANSI編碼。 – tejoe 2014-08-28 14:06:16
我不知道Linux中的配置文件位置,因爲我使用Windows。對於'JAVA_OPTS',請參閱http://stackoverflow.com/questions/2011311/running-java-with-java-opts-env-variable – icza 2014-08-28 14:10:05