2014-08-28 21 views
1

後更新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更新。

任何幫助表示讚賞。

+0

作爲最後的手段,Java配置文件/環境變量('JAVA_OPTS')會自動讀取並應用於每個JVM啓動。如果您無法搜索並恢復原始編碼,則可以通過這種方式爲所有Java應用程序「永久」進行設置。 – icza 2014-08-28 12:37:51

+0

你能否對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

+0

我不知道Linux中的配置文件位置,因爲我使用Windows。對於'JAVA_OPTS',請參閱http://stackoverflow.com/questions/2011311/running-java-with-java-opts-env-variable – icza 2014-08-28 14:10:05

回答

4

感謝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 
1

只需點擊類似的東西(在Debian)。這是由默認的LANG/LC設置爲未在/etc/locale.gen中配置的語言環境引起的。

爲了解決這個問題,我從/etc/locale.gen中取消了註釋並運行了sudo locale-gen。

我很驚訝Java不會對此給出任何警告。 Perl中,例如,會產生噪音,告訴你什麼地方不對頭:

$ LANG=pl_PL.UTF-8 perl -e ''     
perl: warning: Setting locale failed. 
perl: warning: Please check that your locale settings: 
    LANGUAGE = "en_GB:en", 
    LC_ALL = (unset), 
    LANG = "pl_PL.UTF-8" 
    are supported and installed on your system. 
perl: warning: Falling back to the standard locale ("C"). 

此外,爲了解釋一些其他的行爲:ANSI_X3.4-1968只是一個正式的(而且有些不透明)的方式說「 ASCII「和」ISO-8859.1「是ASCII的」通常「8位超集,其以各種名稱包括」西方「或」拉丁文1「而已知,並且與」標準「字符集最接近操作系統,如DOS或較舊版本的Windows都很關心。