我正在测试应用程序的i18n兼容性。
我有Windows 7的英语版本,这意味着系统的显示语言是英语。对于非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和JDK 1.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会错误地获取默认编码,并且很可能是异常行为。

09-27 05:38