2015-08-18 19 views
11

Stavo passando un codice e ho trovato la seguente riga.Charset.for.Java ("ASCII") o Charset.forName ("US-ASCII")

Charset.forName("ASCII") 

Ma quando ho guardato il java documentation ha solo

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

Ma il codice funziona. 'ASCII' e 'US-ASCII' sono sinonimi in questo contesto? o il codice sta prendendo un valore predefinito poiché "ASCII" non è riconosciuto? E quanti byte fa 'ASCII' in questo scenario rappresenta un carattere?

risposta

12

La documentazione sottolinea:

Ogni charset ha un nome canonico e può anche avere uno o più alias. Il nome canonico viene restituito dal metodo name di questa classe . I nomi canonici sono, per convenzione, generalmente in maiuscolo. Gli alias di un set di caratteri vengono restituiti dal metodo aliases.

Inoltre, javadoc di Charset.forName(String charsetName) ti dice:

charsetName - Il nome del set di caratteri richiesto; possono essere sia un nome canonica o un alias

Con questo codice è possibile saperne di più circa i set di caratteri:

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

Grazie, è stato molto utile –

0

ASCII è un alias per US-ASCII. Usa un byte da 7 bit per ogni carattere.

Nota: se si desidera compattezza e semplicità, suggerisco di utilizzare ISO-8859-1. Anche questo usa 1 byte per carattere ma ha una gamma più ampia. Supporta \u0000 a u00FF, mentre US-ASCII supporta \u0000 a \u007F

+1

Grazie, sembra IANA preferisce il nome di 'US-ASCII' –

+0

Non dovresti raccomandare ISO-8859-1 per nient'altro che la compatibilità con il software legacy. Provoca più problemi di quanti ne risolva, e se non vivi in ​​Occidente (e OP no), in realtà è totalmente inutile. –

+0

@KarolS Sono abbastanza sicuro che i dati crittografati produrranno gli stessi byte in ogni paese. ;) Ho affermato che l'uso di ISO-8859-1 è una cattiva idea, ma funzionerebbe, indipendentemente da quale lingua o alfabeto perché la crittografia funziona allo stesso modo ovunque. –

1

L'esecuzione del seguente frammento, stampe tutti insieme di caratteri che sono disponibili:

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

non vedo ASCII nella lista. Guardando il codice per defaultCharset() nella classe Charset si vede che se lo file.encoding non è valido, il suo valore predefinito è 'utf-8'.

In esecuzione il seguente frammento, stampa 'UTF-8' come set di caratteri predefinito.

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

Grazie, non sapevo che il valore predefinito fosse 'utf-8'. –

+0

Nemmeno io, fino a quando ho controllato :). Per favore, accetta la risposta se ti è stato d'aiuto. – KDM

+0

il mio codice sembra funzionare con 'ASCII' dove il ricevitore si aspetta 'ASCII'. Quindi se effettivamente non è valido e usa 'utf-8' allora il mio ricevitore non dovrebbe essere in grado di decodificarlo, dovrebbe? Per prima cosa devo scoprire se effettivamente usa 'ASCII' o ritorna al default 'utf-8' come hai detto. Allora accetterò la risposta .. Grazie ancora –