相关疑难解决方法(0)

如何在Java中找到默认的字符集/编码?

显而易见的答案是使用,Charset.defaultCharset()但我们最近发现这可能不是正确的答案.有人告诉我,结果与java.io类在多个场合使用的真正的默认字符集不同.看起来Java保留了2套默认字符集.有没有人对这个问题有任何见解?

我们能够重现一个失败案例.这是一种用户错误,但它仍然可能暴露所有其他问题的根本原因.这是代码,

public class CharSetTest {

    public static void main(String[] args) {
        System.out.println("Default Charset=" + Charset.defaultCharset());
        System.setProperty("file.encoding", "Latin-1");
        System.out.println("file.encoding=" + System.getProperty("file.encoding"));
        System.out.println("Default Charset=" + Charset.defaultCharset());
        System.out.println("Default Charset in Use=" + getDefaultCharSet());
    }

    private static String getDefaultCharSet() {
        OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
        String enc = writer.getEncoding();
        return enc;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的服务器需要Latin-1中的默认字符集来处理传统协议中的一些混合编码(ANSI/Latin-1/UTF-8).所以我们所有的服务器都运行这个JVM参数,

-Dfile.encoding=ISO-8859-1
Run Code Online (Sandbox Code Playgroud)

这是Java 5的结果,

Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1
Run Code Online (Sandbox Code Playgroud)

有人试图通过在代码中设置file.encoding来更改编​​码运行时.我们都知道这不起作用.但是,这显然抛弃了defaultCharset(),但它不会影响OutputStreamWriter使用的实际默认字符集.

这是一个错误或功能吗?

编辑:接受的答案显示了问题的根本原因.基本上,您不能信任Java 5中的defaultCharset(),它不是I/O类使用的默认编码.看起来Java 6纠正了这个问题.

java encoding character-encoding

88
推荐指数
3
解决办法
24万
查看次数

标签 统计

character-encoding ×1

encoding ×1

java ×1