Utilisation étendue de la table ASCII en Java
La table ASCII associe 128 caractères (de 0 à 127) à leurs codes numériques. La table ASCII étendue va jusqu'à 255 et ajoute les caractères latins accentués et divers symboles. En Java, ces codes se manipulent aisément via le type char, mais quelques pièges subsistent avec Unicode.
Conversion char ↔ int
Un char en Java est un entier non signé sur 16 bits. L'ASCII occupe les valeurs 0 à 127, l'ASCII étendu 128 à 255.
char lettre = 'A';
int code = lettre; // promotion implicite → 65
System.out.println((int) lettre); // 65
int valeur = 65;
char c = (char) valeur; // cast explicite → 'A'
Afficher la table ASCII complète
public class TableAscii {
public static void main(String[] args) {
for (int i = 32; i < 127; i++) { // caractères imprimables
System.out.printf("%3d : %c%n", i, (char) i);
}
}
}
// Sortie :
// 32 : (espace)
// 33 : !
// 34 : "
// ... jusqu'à 126 : ~
Les codes 0 à 31 sont des caractères de contrôle non imprimables (TAB, LF, CR, BEL, etc.). Le code 127 est DEL.
Table ASCII étendue (128 à 255)
La plage 128-255 n'a pas de signification universelle — elle dépend de l'encodage. L'ASCII étendu le plus courant en Europe occidentale est ISO-8859-1 (Latin-1) :
System.out.println((char) 128); // dépend de l'encodage de sortie
System.out.println((char) 233); // 'é' en ISO-8859-1 / Latin-1
System.out.println((char) 224); // 'à' en ISO-8859-1
En Windows-1252, en MacRoman ou en CP437 (DOS), ces mêmes codes représentent des caractères différents — c'est la source classique du "mojibake".
Convertir une chaîne en tableau de codes
String s = "Hello";
char[] chars = s.toCharArray();
int[] codes = s.chars().toArray();
for (int code : codes) System.out.print(code + " ");
// 72 101 108 108 111
Détecter si un caractère est ASCII
public static boolean estAscii(char c) {
return c <= 127;
}
public static boolean estAsciiEtendu(char c) {
return c <= 255;
}
public static boolean estAsciiImprimable(char c) {
return c >= 32 && c < 127;
}
La classe Character — bien plus puissante
Pour des tests au-delà de l'ASCII (Unicode complet), préférez la classe Character :
Character.isLetter('é'); // true
Character.isDigit('7'); // true
Character.isWhitespace(' '); // true
Character.isUpperCase('A'); // true
Character.toLowerCase('A'); // 'a'
Conversion entre encodages
Si vous recevez des octets dans un encodage ASCII étendu et devez les convertir en chaîne Java (UTF-16 en interne) :
byte[] bytes = { (byte) 233, (byte) 224, (byte) 231 };
String s = new String(bytes, java.nio.charset.StandardCharsets.ISO_8859_1);
System.out.println(s); // éàç
Inverse — obtenir les octets dans un encodage donné :
byte[] out = "café".getBytes(java.nio.charset.StandardCharsets.ISO_8859_1);
// out = { 99, 97, 102, -23 } (-23 = 233 en non signé)
Pièges courants
Char signé en Java — non
En Java, char est non signé (0 à 65535). Pas de valeur négative. Mais byte est signé (-128 à 127). Convertir un byte > 127 en char nécessite d'ajouter 256 :
byte b = (byte) 233; // stocké comme -23
char c = (char) (b & 0xFF); // & 0xFF force la lecture non signée
System.out.println((int) c); // 233
Concaténation vs addition
char c = 'A';
System.out.println(c + 1); // 66 — addition numérique
System.out.println("" + c + 1); // "A1" — concaténation de String
Et Unicode dans tout ça ?
Les 128 caractères ASCII sont identiques à Unicode pour les 128 premiers code points (U+0000 à U+007F). L'ASCII est un sous-ensemble parfait d'Unicode.
L'ASCII étendu (128-255) correspond à Latin-1 Supplément en Unicode (U+0080 à U+00FF). Au-delà, Unicode définit ~150 000 caractères couvrant toutes les écritures humaines.
Pour du texte international (émojis, CJK), utilisez les méthodes codePoints() de String plutôt que chars(), pour traiter correctement les paires de substitution.
Usage pratique
Quelques cas où jouer avec les codes ASCII est encore utile :
- Chiffres :
c - '0'convertit '0'-'9' en 0-9. - Majuscule/minuscule :
c + 32passe 'A'-'Z' en 'a'-'z'. - Validation stricte : accepter uniquement les caractères ASCII dans un identifiant.
- Protocoles bas niveau (HTTP, SMTP) qui sont définis en ASCII.
Pour tout le reste — affichage utilisateur, fichiers, données externes — travaillez en Unicode UTF-8. L'ASCII reste un outil mental utile pour comprendre ce que Java fait sous le capot, mais rarement un choix d'encodage au XXIe siècle.