web-dev-qa-db-ja.com

Java VMはデフォルトのfile.encodingをどのように決定しますか?

Mac OS X 10.8(ターミナルから)でJavaプログラムを実行しており、Java VM's file.encodingはデフォルトで「SJIS」になっています。システムプロパティを出力するだけの小さなJavaプログラムを試してみましたが、これはJava VM =それ自体はデフォルトでSJISになっています(それに直面しましょう、誰もSJISが好きではありません!)

私の端末はUTF-8に設定されています。 $ LANGが設定されておらず、$ LC_CTYPEが「UTF-8」です。環境変数や端末設定には、どこにも「JIS」が含まれていません、AFAICT。

Mac OSXのJavaでは、どこでfile.encodingからの値? UTF-8を使用するように変更できるシステム設定はありますか?プログラムによっては「ぎこちない」と「不可能」の間のどこかにあるので、このアプリケーションごととライブラリごとに指定する必要はありません。

このための環境変数を設定しても大丈夫だと思いますが、Javaに影響を与える標準変数($ LANGなど)が見つかりません。

4
Ken

このコードはいつでもお気に入りのIDEのJavaクラスに入れることができます

_import Java.nio.charset.Charset;
(...)
Charset.defaultCharset()
_

次に、defaultCharset()リンクをたどって、JVMインスタンスがデフォルトの文字セットを決定する方法を理解します。 win64bホットスポットJVMjdk 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 src )?つまり、_LANG=ja_JP.PCK_( src )の場合、SJISがデフォルト値になる可能性があります。

1
boly38