在java中运行时更新默认字符集编码?

在java中运行时更新默认字符集编码?,java,encode,Java,Encode,在java中运行时是否有更新默认字符集编码的方法?谢谢,不,没有切实可行的方法来改变它。例如,在OpenJDK中,默认字符集是在虚拟机启动时从文件.encoding系统属性读取的,它存储在字符集类的私有静态字段中。如果需要使用不同的编码,则应使用允许指定编码的类 您可以通过反射更改私有字段来侵入。如果你真的,真的,没有其他选择,你可以尝试这样做。您将代码定位于特定JVM的特定版本,而它可能无法在其他JVM上工作。以下是如何更改当前版本OpenJDK中的默认字符集: import java.nio

在java中运行时是否有更新默认字符集编码的方法?谢谢,

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

您可以通过反射更改私有字段来侵入。如果你真的,真的,没有其他选择,你可以尝试这样做。您将代码定位于特定JVM的特定版本,而它可能无法在其他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
    }
}
import java.nio.charset.charset;
导入java.lang.reflect.*;
公开课考试{
公共静态void main(字符串[]args)引发异常{
System.out.println(Charset.defaultCharset());
魔术(“拉丁2”);
System.out.println(Charset.defaultCharset());
}
私有静态void magic(字符串s)引发异常{
c类=Charset.Class;
字段defaultCharsetField=c.getDeclaredField(“defaultCharset”);
defaultCharsetField.setAccessible(true);
defaultCharsetField.set(null,Charset.forName);
//如果需要,现在使用新的字符集打开System.out和System.err
}
}

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

您可以通过反射更改私有字段来侵入。如果你真的,真的,没有其他选择,你可以尝试这样做。您将代码定位于特定JVM的特定版本,而它可能无法在其他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
    }
}
import java.nio.charset.charset;
导入java.lang.reflect.*;
公开课考试{
公共静态void main(字符串[]args)引发异常{
System.out.println(Charset.defaultCharset());
魔术(“拉丁2”);
System.out.println(Charset.defaultCharset());
}
私有静态void magic(字符串s)引发异常{
c类=Charset.Class;
字段defaultCharsetField=c.getDeclaredField(“defaultCharset”);
defaultCharsetField.setAccessible(true);
defaultCharsetField.set(null,Charset.forName);
//如果需要,现在使用新的字符集打开System.out和System.err
}
}

您是否尝试搜索它?复制品?你试过找它吗?复制品?事实上,除非你真的,真的没有其他选择。请注意,这取决于特定Java版本的实现细节;这可能不适用于未来的Java版本,或者Oracle以外的Java实现。好的一点是,我添加了一些措辞,以更清楚地说明此代码仅适用于当前版本的OpenJDK。事实上,只有当您真的,真的没有其他选择的时候。请注意,这取决于特定Java版本的实现细节;这可能不适用于未来的Java版本,或者Oracle以外的Java实现。好的一点是,我添加了一些措辞,以更清楚地说明此代码仅适用于当前版本的OpenJDK。