如何在Java中找到默认的字符集/编码?
如何在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修正了这个问题。