Java defaultCharset()在JDK1.7和JDK1.6下得到不同的结果

Java defaultCharset()在JDK1.7和JDK1.6下得到不同的结果,java,encoding,windows-7,character-encoding,internationalization,Java,Encoding,Windows 7,Character Encoding,Internationalization,我正在测试我的应用程序的i18n兼容性。 我有一个英文版的Windows7,这意味着系统的显示语言是英语。对于非unicode应用程序,我将系统语言环境设置为中文 我的应用程序在jdk1.6下导出带有汉字的Html文件时遇到问题,但在jdk1.7下运行时效果良好 我调试了它,发现直接原因是Charset.defaultCharset()返回了不同的值 在jdk1.7下Charset.defaultCharset()返回的GBK是中文字符集 在jdk1.6下Charset.defaultChars

我正在测试我的应用程序的i18n兼容性。 我有一个英文版的Windows7,这意味着系统的显示语言是英语。对于非unicode应用程序,我将系统语言环境设置为中文

我的应用程序在jdk1.6下导出带有汉字的Html文件时遇到问题,但在jdk1.7下运行时效果良好

我调试了它,发现直接原因是
Charset.defaultCharset()
返回了不同的值

在jdk1.7下
Charset.defaultCharset()
返回的
GBK
是中文字符集

在jdk1.6下
Charset.defaultCharset()
返回
window_1252
,它是拉丁语的字符集

我知道这个问题可以通过在代码中指定字符集来解决,比如说
utf-8


但是我想知道为什么
Charset.defaultCharset()
在JDK1.7和JDK1.6下返回不同的值。

Charset.defaultCharset()给出了JVM运行的字符集,所以它并不总是相同的值。例如,如果使用Netbeans运行程序,它将始终返回UTF-8,因为这是Netbeans中Java项目的默认编码

我有一个类似于你的设置。我的Windows是英文的(菜单、对话框都是英文的),我在非Unicode应用程序中使用土耳其语。当我在没有任何标志或系统参数的情况下启动JVM时,当调用
Charset.defaultCharset()
时,Java 7和Java 6运行时都会给出“CP1254”
System.getProperty(“file.encoding”)
和默认IO编码也是相同的。(在这两个Java版本中,系统的区域设置不同,但这是另一回事。)

所以我想您的问题要么是关于如何启动JVM,要么是关于JVM如何决定它应该使用的默认编码。如果您确定问题不是前一个问题(您运行的JVM没有任何编码参数,并且您没有尝试更改程序中任何地方的默认字符集),那么JVM错误地获取默认编码,很可能是异常行为

报告说:

受支持的编码在的不同实现之间有所不同 Java平台,标准版7(JavaSE7)

报告说:

Java虚拟机的每个实例都有一个默认字符集, 它可能是标准字符集之一,也可能不是。默认值 字符集在虚拟机启动期间确定,通常 取决于基础服务器使用的区域设置和字符集 操作系统

此外,我还发现了一个关于使用
-Dfile.encoding
的最终评估:

这不是一个bug。不需要“file.encoding”属性 J2SE平台规范;这是太阳的内部细节 实现,不应该由用户代码检查或修改。 它也是只读的;从技术上讲,这是不可能的 支持将此属性设置为服务器上的任意值 命令行或程序执行期间的任何其他时间

更改VM使用的默认编码的首选方法和 运行时系统将更改基础平台的区域设置 在启动Java程序之前


据猜测,读取“非Unicode应用程序的语言环境”设置是Windows JRE 7的一项新功能。(我猜测是因为它可能不够重要,不足以在发行说明中提及,而且bug数据库的搜索功能实际上并没有搜索bug数据库。)Java 7中有一些功能-可能这是与它捆绑在一起的。您可以发布通过调用
System.getProperty(“file.encoding”)得到的信息吗
在jdk 6和7中?