wake-up-neo.com

Java Charset.forName ("ASCII") oder Charset.forName ("US-ASCII")

Ich habe einen Code durchgesehen und bin auf die folgende Zeile gestoßen.

Charset.forName("ASCII")

Aber als ich mir die Java Dokumentation angeschaut habe, hat das nur 

US-ASCII    ISO-8859-1    UTF-8   UTF-16BE   UTF-16LE   UTF-16  

Aber der Code funktioniert. Sind "ASCII" und "US-ASCII" Synonyme in diesem Zusammenhang? oder nimmt der Code einen Standardwert an, da 'ASCII' nicht erkannt wird? Und wie viele Bytes repräsentiert "ASCII" in diesem Szenario ein Zeichen?

11
user4700203

Die Dokumentation weist darauf hin:

Jeder Zeichensatz hat einen kanonischen Namen und kann auch einen oder mehrere Aliase. Der kanonische Name wird von der Namensmethode dieser .__ zurückgegeben. Klasse. Kanonische Namen werden normalerweise in Großbuchstaben geschrieben. Das Aliase eines Zeichensatzes werden von der Aliase-Methode zurückgegeben.

Der Javadoc von Charset.forName(String charsetName) sagt Ihnen weiter:

charsetName - Der Name des angeforderten Zeichensatzes. kann entweder eine .__ sein. kanonischer Name oder ein Alias ​​

Mit diesem Code können Sie mehr über die Zeichensätze erfahren:

Charset ascii = Charset.forName("US-ASCII");
System.out.println(ascii.aliases());
// [ANSI_X3.4-1968, cp367, csASCII, iso-ir-6, ASCII, iso_646.irv:1983, ANSI_X3.4-1986, ascii7, default, ISO_646.irv:1991, ISO646-US, IBM367, 646, us]

System.out.println(ascii.newEncoder().maxBytesPerChar());
// 1.0

Charset utf8 = Charset.forName("UTF-8");
System.out.println(utf8.newEncoder().maxBytesPerChar());
// 3.0
18
Mathias Begert

Beim Ausführen des folgenden Ausschnitts werden alle verfügbaren Zeichensätze gedruckt:

    SortedMap<String,Charset> availableCharsets = Charset.availableCharsets();
    Set<String> keySet = availableCharsets.keySet();
    for (String key : keySet) {
        System.out.println(key);
    }

Ich sehe ASCII nicht in der Liste. Ein Blick auf den Code für defaultCharset() in der Charset-Klasse zeigt, dass, wenn der file.encoding ungültig ist, der Standardwert 'utf-8' ist.

Wenn Sie das folgende Snippet ausführen, wird 'UTF-8' als Standardzeichensatz gedruckt.

    System.setProperty("file.encoding", "ASCII");
    System.out.println(Charset.defaultCharset());

ASCII ist ein Alias ​​für US-ASCII. Für jedes Zeichen wird ein 7-Bit-Byte verwendet.

Hinweis: Wenn Sie Kompaktheit und Einfachheit wünschen, empfehle ich die Verwendung von ISO-8859-1. Dies verwendet ebenfalls 1 Byte pro Zeichen, hat jedoch einen größeren Bereich. Es unterstützt \u0000 bis u00FF, wohingegen US-ASCII \u0000 bis \u007F unterstützt. 

0
Peter Lawrey