Charset.defaultCharset()和file.encoding有什么区别?

4

我在MS Windows 7上运行Java SE 8,并使用Eclipse和Netbeans。通过运行以下程序,我发现每个表达式的返回值是不同的!

System.out.println(System.getProperty("file.encoding"));
System.out.printf(Charset.defaultCharset());

关于Charset.defaultCharset(),它被描述为“返回默认字符集”,而file.encoding则被解释为“JVM系统属性file.encoding中保存了默认字符集”。因此,似乎Charset.defaultCharset()必须返回与file.encoding中存储的内容完全相同的结果。但是我发现这并不总是发生!!例如,如果我通过

更改file.encoding的内容
System.setProperty("file.encoding", "Big5");
System.out.println(System.getProperty("file.encoding")); 

它输出Big5编码,但是...
System.out.printf(Charset.defaultCharset()); 

在Eclipse中它会打印出Windows-1256,而在Netbeans中则会打印出UTF-8的先前值。请问能否解释一下它们是什么以及实际上它们之间的关系和区别。


更新:过了一段时间后,在这个网站上我发现了与这个主题相关的非常有用的内容,问题得到了解决:

https://javarevisited.blogspot.com/2012/01/get-set-default-character-encoding.html?m=1

1个回答

2

Charset.defaultCharset()方法返回的值是JVM启动时设置的默认字符集,之后无法更改。

另一方面,系统属性可以更改,但在各种JDK类中是否会产生所需的效果是一个不同的问题。

为了使用不同的字符集,最好提供一个JVM参数,例如:

java -cp <classpath> <package.classname> -Dfile.encoding=Big5

谢谢Jaywalker,但我不明白JVM字符集和程序使用的字符集之间的区别。假设JVM以UTF-8启动,如果我们将file.encoding设置为其他字符集,那么在Java程序中,这个UTF-8字符集(JVM字符集)在哪里发挥作用? - feel free
输入流读取器和相应的写入器类会带有一个额外参数,您可以在其中指定编码。为什么不使用它呢?默认字符集就是这样——当您没有指定任何内容时,它就是默认值。 - Jaywalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接