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

Java JVM如何确定Linux上argv的(默认?)字符编码,java,linux,character-encoding,environment,Java,Linux,Character Encoding,Environment,Java有一个函数,它在没有显式提供字符编码的上下文中使用。关于如何选择编码的文档很模糊: 默认字符集在虚拟机启动期间确定,通常取决于基础操作系统的区域设置和字符集 该文档必须是模糊的,因为JVM使用的方法是特定于系统的 经常使用默认字符编码;最好使用显式指示的编码,或者对某些I/O始终使用相同的编码。但默认字符编码的一个不可避免的用法似乎是用于命令行参数的字符编码。在POSIX系统(如Linux)上,JVM的本机(C/C++)代码以C/C++char指针的空终止列表的形式获取命令行参数。应该将

Java有一个函数,它在没有显式提供字符编码的上下文中使用。关于如何选择编码的文档很模糊:

默认字符集在虚拟机启动期间确定,通常取决于基础操作系统的区域设置和字符集

该文档必须是模糊的,因为JVM使用的方法是特定于系统的

经常使用默认字符编码;最好使用显式指示的编码,或者对某些I/O始终使用相同的编码。但默认字符编码的一个不可避免的用法似乎是用于命令行参数的字符编码。在POSIX系统(如Linux)上,JVM的本机(C/C++)代码以C/C++
char
指针的空终止列表的形式获取命令行参数。应该将其视为字节指针,因为它们必须对中的代码点进行编码。JVM必须解释这些C/C++
char
s(字节)序列,以将它们转换为Java
char
s序列,并将其提供给Java程序的
main()
。我假设JVM对此使用默认字符编码

因此,我需要准确地知道JVM如何确定特定系统(现代GNU/Linux操作系统)的默认编码,这样我就可以提供有关程序行为的用户文档,这样程序的用户就可以预测它的行为


我想JVM会检查一些环境变量,但哪些是?

您当然可以查看
java.nio.charset.charset.defaultCharset()的源代码。当我在我的系统(64位Windows 7,带有Oracle JDK 8 update 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
,PHP程序可以有一个。这意味着有点不精确,因此如果不使用
-Dfile.encoding
标志,它将只使用UTF-8,没有任何来自底层的解读,是吗?Cfr文档:“在虚拟机启动期间确定,通常取决于基础操作系统的区域设置和字符集”。@Mabsten不一定。我怀疑JVM中的某个地方有一个
file.encoding
的默认设置,如果不使用
-D
显式设置,将使用该设置。默认值将取决于您使用的操作系统。