2012-02-14 71 views

回答

4

不,没有切实可行的方法来改变它。例如,在OpenJDK中,当虚拟机启动并且它被存储在Charset类的私有静态字段中时,几乎从file.encoding系统属性读取默认字符集。如果你需要使用不同的编码,你应该使用允许指定编码的类。

您可以通过反射改变私人领域来破解自己的路。这是你可能尝试的东西,如果你真的,真的,没有其他选择。您将代码定位到特定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 2012-02-14 21:30:40

+0

好点,我已经添加了措辞,使它更清楚,这个代码只适用于当前版本的OpenJDK。 – Joni 2012-02-14 22:25:00

+0

感谢您的解决方案,并非常感谢。 – 2012-02-15 00:58:27