Java 有一个默认字符编码,它在未显式提供字符编码的上下文中使用。的文档how它选择编码是模糊的:
默认字符集是在虚拟机启动期间确定的,通常取决于底层操作系统的区域设置和字符集。
该文档必须含糊不清,因为 JVM 使用的方法是特定于系统的。
通常使用默认的字符编码一个坏主意;最好使用明确指定的编码,或者对于某些 I/O 始终使用相同的编码。但默认字符编码的一种不可避免的使用似乎是用于命令行参数的字符编码。在 Linux 等 POSIX 系统上,JVM 的本机 (C/C++) 代码将命令行参数获取为以 null 结尾的 C/C++ 列表char
指针。应该将其视为字节指针,因为它们必须编码中的代码点某种(不清楚)方式。 JVM 必须解释这些 C/C++ 序列char
s(字节)将它们转换成Java序列char
s,给予main()
Java 程序的。我假设 JVM 为此使用默认的字符编码。
因此,我需要准确地了解 JVM 如何确定特定系统(现代 GNU/Linux 操作系统)的默认编码,以便我可以提供有关我的程序行为方式的用户文档,以便我的程序的用户可以预测它的行为方式表现。
我猜 JVM 会检查一些环境变量,但是哪些变量呢?
当然你可以看一下源码java.nio.charset.Charset.defaultCharset()
。当我在我的系统(64 位 Windows 7,带有 Oracle JDK 8 更新 25)上执行此操作时,我看到以下内容:
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
String csn = AccessController.doPrivileged(
new GetPropertyAction("file.encoding"));
Charset cs = lookup(csn);
if (cs != null)
defaultCharset = cs;
else
defaultCharset = forName("UTF-8");
}
}
return defaultCharset;
}
换句话说,它查看系统属性file.encoding
如果找不到匹配的Charset
例如,它使用UTF-8
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)