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ę.

Rozpoznać
źródło

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 )

boly38
źródło
-1

Jestem pewien, że jest to specyficzne dla implementacji JVM, ale byłem w stanie „wpłynąć” na domyślny plik. JVM mojego kodowania, wykonując: export LC_ALL = en_US.UTF-8 (działająca wersja Java = 1.7.0_80 w OS = Ubuntu 12.04)

cały kredyt trafia na http://www.philvarner.com/2009/10/24/unicode-in-java-default-charset-part-4/

mike32b
źródło
Proszę podać odpowiednie informacje z linku
Ramhound