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

10 浏览
0 Comments

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

显而易见的答案是使用Charset.defaultCharset(),但我们最近发现这可能不是正确的答案。有人告诉我,在几种情况下,结果与java.io类实际使用的默认字符集不同。看起来Java保留了两组默认字符集。有人对这个问题有什么见解吗?

我们能够复制一个失败的案例。这有点用户错误,但它可能仍然暴露了所有其他问题的根本原因。以下是代码,

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;
    }
}

我们的服务器需要默认字符集为Latin-1来处理遗留协议中的一些混合编码(ANSI/Latin-1/UTF-8)。因此,我们所有的服务器都使用这个JVM参数运行,

-Dfile.encoding=ISO-8859-1

以下是在Java 5上的结果,

Default Charset=ISO-8859-1
file.encoding=Latin-1
Default Charset=UTF-8
Default Charset in Use=ISO8859_1

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

这是一个bug还是功能?

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

0