web-dev-qa-db-fra.com

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

Je parcourais un code et suis tombé sur la ligne suivante.

Charset.forName("ASCII")

Mais quand j’ai jeté un œil à la documentation Java

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

Mais le code fonctionne. Est-ce que "ASCII" et "US-ASCII" sont des synonymes dans ce contexte? ou le code prend-il une valeur par défaut puisque "ASCII" n'est pas reconnu? Et combien d'octets «ASCII» dans ce scénario représente-t-il un caractère?

11
user4700203

La documentation souligne:

Chaque jeu de caractères a un nom canonique et peut également avoir un ou plusieurs alias. Le nom canonique est renvoyé par la méthode name de this classe. Les noms canoniques sont, par convention, généralement en majuscules. Le les alias d'un jeu de caractères sont retournés par la méthode des alias.

De plus, le javadoc de Charset.forName(String charsetName) vous dit:

charsetName - Le nom du jeu de caractères demandé; peut être soit un nom canonique ou un alias

Avec ce code, vous pouvez en savoir plus sur les jeux de caractères:

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

L'exécution de l'extrait suivant imprime tous les jeux de caractères disponibles:

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

Je ne vois pas ASCII dans la liste. En examinant le code de defaultCharset() dans la classe Charset, on constate que si file.encoding est invalide, la valeur par défaut est 'utf-8'.

L'exécution de l'extrait suivant imprime 'UTF-8' en tant que jeu de caractères par défaut.

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

ASCII est un alias pour US-ASCII. Il utilise un octet de 7 bits pour chaque caractère.

Remarque: si vous voulez de la compacité et de la simplicité, je vous suggère d’utiliser ISO-8859-1. Cela utilise également 1 octet par caractère mais a une plage plus large. Il supporte \u0000 à u00FF alors que US-ASCII supporte \u0000 à \u007F 

0
Peter Lawrey