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

标签 java encode

有没有办法在java运行时更新默认的字符集编码?谢谢,

最佳答案

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

您也许可以通过反射更改私有(private)字段来侵入。如果您真的、真的没有其他选择,您可以尝试一下。您将代码定位到特定 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
    }
}

关于java - 在java运行时更新默认字符集编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282990/

相关文章:

ios - 用于存储自定义对象的 Userdefault 编码器类的数据

javascript - 如何获取 JSON 数组中的元素数量?

ruby - 如何避免在解码文件时出现 UndefinedConversionError?

python - Python,如何在输出中获得西里尔字母?

java - 如何使用 Spring MVC 的单表继承获取子类属性

java - 使用 gradle、Android Studio、ADT 构建依赖项

在 Jenkins 上解析 Groovy 脚本时出现 java.lang.StackOverflowError

java - 32位eclipse和64位java程序

java - 尝试使用种子值生成随机字符来测试程序。以及将随机生成的 int 转换为 char

language-agnostic - 一个向前的单词和向后不同的单词的代码