Java VM 如何确定其默认的 file.encoding?

Java VM 如何确定其默认的 file.encoding?

我在 Mac OS X 10.8 上运行 Java 程序(从终端),Java VMfile.encoding默认为“SJIS”。我甚至尝试了一个小型 Java 程序,它除了打印出系统属性外什么都不做,这表明 Java VM 本身默认为 SJIS。(让我们面对现实,没有人喜欢 SJIS!)

我的终端设置为 UTF-8。我的 $LANG 未设置,并且 $LC_CTYPE 为“UTF-8”。据我所知,没有任何环境变量或终端设置中包含“JIS”。

在 Mac OS X 上的 Java 中,它file.encoding从哪里获取值?是否有我可以更改的系统设置以使其使用 UTF-8?我不想必须为每个应用程序和每个库指定这一点,因为这介于“尴尬”和“不可能”之间,具体取决于程序。

我想我可以为此设置一个环境变量,但我找不到任何影响 Java 的标准变量(例如 $LANG)。

答案1

你可以把这段代码放到你最喜欢的 IDE 的 Java 类中

import java.nio.charset.Charset;
(...)
Charset.defaultCharset()

然后点击defaultCharset()链接,了解 JVM 实例如何确定默认字符集。win 64b hotspot JVM jdk 1.7 上的示例:

/**
 * Returns the default charset of this Java virtual machine.
 *
 * <p> The default charset is determined during virtual-machine startup and
 * typically depends upon the locale and charset of the underlying
 * operating system.
 *
 * @return  A charset object for the default charset
 *
 * @since 1.5
 */
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在启动时设置..

java -Dfile.encoding=UTF-8 MyClass

在你的情况下,SJIS似乎指的是日本编码(MS Japan OS源码)?我的意思SJIS是,当LANG=ja_JP.PCK源码

答案2

我确信这是特定于 JVM 实现的,但我能够通过执行以下操作来“影响”我的 JVM 的默认 file.encoding:export LC_ALL=en_US.UTF-8(在 OS = Ubuntu 12.04 上运行 java 版本 = 1.7.0_80)

所有的功劳都归功于http://www.philvarner.com/2009/10/24/unicode-in-java-default-charset-part-4/

相关内容