2012-02-14 4 views

答えて

4

いいえ、それを実際に変更する方法はありません。たとえば、OpenJDKでは、デフォルトの文字セットはfile.encodingシステムプロパティから読み込まれ、仮想マシンが起動し、Charsetクラスのプライベート静的フィールドに格納されます。別のエンコーディングを使用する必要がある場合は、エンコーディングを指定できるクラスを使用する必要があります。

あなたは、リフレクションによってプライベートフィールドを変更することで、ハックすることができます。これはあなたが実際に試みるかもしれない何かです、本当に、他のオプションがありません。コードを特定のバージョンの特定のJVMに限定しているので、他のバージョンでは機能しない可能性があります。これはOpenJDKの現在のバージョンでデフォルトの文字セットを変更する方法です:

import java.nio.charset.Charset; 
import java.lang.reflect.*; 

public class test { 
    public static void main(String[] args) throws Exception { 
     System.out.println(Charset.defaultCharset()); 
     magic("latin2"); 
     System.out.println(Charset.defaultCharset()); 
    } 

    private static void magic(String s) throws Exception { 
     Class<Charset> c = Charset.class; 
     Field defaultCharsetField = c.getDeclaredField("defaultCharset"); 
     defaultCharsetField.setAccessible(true); 
     defaultCharsetField.set(null, Charset.forName(s)); 
     // now open System.out and System.err with the new charset, if needed 
    } 
} 
+2

実際、あなたが**本当に本当に**他の選択肢がない場合にのみ。これは、特定のJavaバージョンの実装の詳細に依存することに注意してください。将来のJavaバージョン、またはOracle以外のJava実装では機能しない可能性があります。 – Jesper

+0

良い点として、このコードは現在のバージョンのOpenJDKでのみ動作することを明確にするために、言葉を追加しました。 – Joni

+0

あなたのソリューションに感謝し、本当に感謝します。 –