2015-08-18 9 views
11

Ich ging durch einen Code und stieß auf die folgende Zeile.Java Charset.forName ("ASCII") oder Charset.forName ("US-ASCII")

Charset.forName("ASCII") 

Aber wenn ich auf der Java sah documentation es hat nur

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

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

Antwort

12

Die Dokumentation weist darauf hin:

Jeder charset einen kanonischen Namen hat und auch eine oder mehr Aliase hat. Der kanonische Name wird von der Namensmethode dieser Klasse zurückgegeben. Kanonische Namen sind per Konvention in der Regel in Großbuchstaben. Die Aliase eines Zeichensatzes werden von der Alias-Methode zurückgegeben.

Ferner ist die javadoc von Charset.forName(String charsetName) sagt Ihnen:

charsetName - Der Name der angeforderten charset; entweder ein

kanonischen Namen oder ein alias kann dieser Code Mit Ihnen mehr über die charsets herausfinden können:

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 
+0

Danke, das war sehr hilfreich –

0

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

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 zu u00FF während US-ASCII \u0000 zu \u007F

+1

Danke, es scheint IANA den Namen 'US-ASCII' vorzieht –

+0

Sie sollten ISO-8859-1 nicht für andere Zwecke als die Kompatibilität mit Legacy-Software empfehlen. Es verursacht mehr Probleme als es löst, und wenn Sie nicht im Westen leben (und OP nicht), ist es tatsächlich völlig nutzlos. –

+0

@KarolS Ich bin mir ziemlich sicher, dass verschlüsselte Daten die gleichen Bytes in jedem Land produzieren werden. ;) Ich habe festgestellt, dass die Verwendung von ISO-8859-1 eine schlechte Idee ist, aber es würde funktionieren, unabhängig von der Sprache oder dem Alphabet, da die Verschlüsselung überall gleich funktioniert. –

1

Ausführen des folgenden Ausschnitt unterstützt, druckt alle Character, die verfügbar sind:

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. Betrachtet man den Code für defaultCharset() in der Charset-Klasse, wird angezeigt, dass file.encoding ein ungültiger Wert ist und standardmäßig "utf-8" lautet.

Beim Ausführen des folgenden Snippets wird "UTF-8" als Standardzeichensatz gedruckt.

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

Danke, ich wusste nicht, dass der Standard 'utf-8' war. –

+0

Ich auch nicht, bis ich es überprüft habe :). Bitte akzeptiere die Antwort, wenn es geholfen hat. – KDM

+0

mein Code scheint mit 'ASCII' zu arbeiten, wo der Empfänger 'ASCII' erwartet. Wenn es also ungültig ist und 'utf-8' benutzt, dann sollte mein Empfänger es nicht entschlüsseln können, oder? Zuerst muss ich herausfinden, ob es tatsächlich 'ASCII' verwendet oder wie von Ihnen erwähnt auf 'utf-8' zurückspringt. Dann werde ich die Antwort akzeptieren .. Danke nochmal –

Verwandte Themen