gpt4 book ai didi

java - JVM 如何确定 argv 在 Linux 上的(默认?)字符编码

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:30:38 25 4
gpt4 key购买 nike

Java 有一个 default character encoding ,它在未明确提供字符编码的上下文中使用。 如何选择编码的文档是模糊的:

The default charset is determined during virtual-machine startup and typically depends upon the locale and charset of the underlying operating system.

该文档必须含糊不清,因为 JVM 使用的方法是系统特定的。

使用默认的字符编码通常是a bad idea ;最好使用明确指示的编码,或者对某些 I/O 始终使用相同的编码。但是默认字符编码的一种不可避免的使用似乎是用于命令行参数的字符编码。在 Linux 等 POSIX 系统上,JVM 的 native (C/C++) 代码获取命令行参数作为 C/C++ char 指针的空终止列表。应该将其视为字节指针,因为它们必须是 some (unclear) manner 中的编码代码点。 . JVM 必须解释那些 C/C++ char(字节)序列,将它们转换为 Java char 序列,提供给 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.

关于java - JVM 如何确定 argv 在 Linux 上的(默认?)字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27923366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com