显而易见的答案是使用,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;
}
}
我们的服务器要求使用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使用的实际默认字符集。
这是错误还是功能?
编辑:接受的答案显示了问题的根本原因。基本上,您不能信任Java 5中的defaultCharset(),它不是I / O类使用的默认编码。看起来Java 6可以解决此问题。