Charset.defaultCharset()在JDK1.7和JDK 1.6下得到不同的结果

Liu*_*ian 8 java encoding internationalization character-encoding windows-7

我正在测试我的应用程序的i18n兼容性.我有一个英文版的Windows 7,这意味着系统的显示语言是英语.我将系统区域设置为非unicode应用程序的中文.

我的应用程序在导出jdk1.6下的中文字符的Html文件时遇到问题,但在jdk1.7下运行时工作正常.

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

在jdk1.7下Charset.defaultCharset()返回GBK,这是中文的charset.

在jdk1.6下Charset.defaultCharset()返回window_1252,这是拉丁语的charset.

我知道问题可以通过utf-8代码字符集来解决,比如代码.

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

inf*_*tor 3

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

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

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