W jaki sposób wirtualna maszyna Java określa swoje domyślne file.encoding?


4

file.encodingKorzystam z programu Java w systemie Mac OS X 10.8 (z terminala), a domyślną maszyną wirtualną Java jest „SJIS”. Próbowałem nawet małego programu Java, który nie robi nic poza drukowaniem właściwości systemu, i pokazuje, że sama Java VM domyślnie używa SJIS. (I spójrzmy prawdzie w oczy, nikt nie lubi SJIS!)

Mój terminal jest ustawiony na UTF-8. Moje $ LANG nie jest ustawione, a $ LC_CTYPE to „UTF-8”. Żadna zmienna środowiskowa ani ustawienie terminala nie zawiera „JIS”, AFAICT.

Skąd bierze file.encodingwartość w Javie w Mac OS X ? Czy istnieje ustawienie systemowe, które mogę zmienić, aby korzystało z UTF-8? Nie chcę określać tej aplikacji i biblioteki, ponieważ jest to gdzieś pomiędzy „niezręcznym” a „niemożliwym”, w zależności od programu.

Przypuszczam, że nie mam nic przeciwko ustawieniu zmiennej środowiskowej, ale nie mogę znaleźć żadnych standardowych zmiennych (takich jak $ LANG), które wpływają na Javę.

Odpowiedzi:


1

Zawsze możesz umieścić ten kod w klasie Java w swoim ulubionym IDE

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

Następnie kliknij defaultCharset()link, aby zrozumieć, w jaki sposób Twoja instancja JVM określi domyślny zestaw znaków. Przykład dotyczący JVM jdk 1.7 w hotspocie win 64b:

/**
 * 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;
}

Jak wiesz, zawsze możesz ustawić file.encodingprzy starcie.

java -Dfile.encoding=UTF-8 MyClass

W twoim przypadku SJISwydaje się , że odnosi się do japońskiego kodowania (MS Japan OS src )? Mam na myśli, że SJISmoże być wartością domyślną, gdy LANG=ja_JP.PCK( src )


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.