Accès rapide :
La vidéo
Rappels sur les standards d'encodage de caractères
La table ASCII
Les tables d'encodage dérivées d'ASCII (ISO-8859-1, ...)
Le standard Unicode - ISO/CEI-10646
Utilisation du type char
Quelques méthodes de tests de vos caractères
Cette vidéo vous montre comment manipuler les caractères (type char) en Java. L'utilisation de caractères Unicode vous est aussi présentée.
En informatique, un caractère est stocké en mémoire sous forme d'une valeur numérique. Une chaîne de caractères correspond donc à un tableau (un ensemble) de valeurs numériques. Chaque caractère est associé à une valeur numérique distincte : l'ensemble des valeurs numériques (des caractères) supportées est appelé table d'encodage. Il existe un grand nombre de tables d'encodage.
Historiquement parlant, la première table d'encodage à avoir été standardisée est ASCII (American Standard Coding for Information Interchange). Elle est apparue dans les années 1960. C'est une table d'encodage utilisant 7 bits : elle permet donc de définir un maximum de 128 caractères (indicés de 0 à 128). Seuls 95 d'entre eux sont imprimables, les autres correspondent à des caractères spéciaux (retour à ligne, tabulation, ...).
Une question qui vous taraude peut-être : pourquoi ASCII n'utilise que 7 bits et non pas les 8 bits disponible sur un octet ? Bien entendu, il y a une raison, mais elle est historique. Il y a fort longtemps, les réseaux informatiques étaient peu fiables en termes de transport de données : il y avait parfois des permutations de bits durant le transport (la probabilité était faible, mais le risque existait). Or à cette époque dominait l'architecture terminaux/serveurs. Les postes utilisateurs n'étaient que des terminaux permettant de se connecter au calculateur (le serveur). Les caractères saisis sur les terminaux devaient donc être transmis au serveur, avec le risque que les caractères reçus ne soient pas ceux émis. Le 8ième bit servait de bit de parité : ce bit prend la valeur 1 si le nombre de bits (dans les 7 premiers) est impaire, 0 sinon. Ainsi, à réception d'un caractère, on recalcule le bit de parité et s'il est différent de celui reçu c'est qu'il y a eu une permutation de bit durant le transport.
Voici l'ensemble des caractères imprimables de la table ASCII.
\ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|
0x61
correspond à un a
(en minuscule), tandis que 0x41
correspond à un A
(en majuscule).
Avec le temps, les couches de protocoles de transport de données se sont sécurisées (notamment UDP - User Datagram Protocol et TCP - Transmission Control Protocol) et le 8ième n'a plus été utilisé comme bits de parité. Pour de plus amples informations sur le standard ASCII, veuillez consulter ce lien https://fr.wikipedia.org/wiki/ASCII
Le 8ième bit s'étant libéré, de nouveaux standards d'encodage ont vu le jour en rajoutant 128 caractères supplémentaires. Le problème c'est qu'il y a des tables utilisées par les langues latines, grec, cyrillique, ... Si deux programmes, utilisant des encodages différents, échangent des données, alors ils risquent de mal interpréter le contenu échangé.
Parmi ces standards d'encodage, on peut retenir « ISO-8859-1 » (plus connue sous le nom de table ISO-Latin 1) qui est utilisée en Europe occidentale. Mais la famille de normes ISO-8859 spécifie plusieurs autres encodages. Pour de plus amples informations sur ISO-8859, consultez ce lien : https://fr.wikipedia.org/wiki/ISO/CEI_8859. Et il existe encore d'autres encodages.
Avec l'avènement d'Internet et les échanges de données au niveau international, il n'était plus possible d'utiliser des encodages sur un seul octet, ni même sur deux octets. C'est pour répondre à ces nouveaux besoins qu'Unicode (plus formellement ISO/CEI-10646) a été défini. A ce jour, plus de 128 000 caractères sont spécifiés par Unicode.
Pour simplifier, on peut dire qu'il existe trois implémentations d'Unicode : UTF-8, UTF-16 et UTF-32. La JVM stocke les caractères et les chaînes de caractères en mémoire en utilisant UTF-16 : chaque caractère utilise deux octets en mémoire (sauf les caractères étendus qui utilisent deux codets). Pour de plus amples informations, veuillez consulter ce lien : https://fr.wikipedia.org/wiki/UTF-16.
Si vous êtes curieux de parcourir la table Unicode, je vous conseille vivement de jeter un coup d'oeil sur ce site : Table de caractères Unicode
Le langage Java vous propose donc le type char
.
Une variable utilisant ce type permet de contenir un caractère et occupera deux octets en mémoire.
Vous avez plusieurs possibilités pour spécifier un caractère, comme le montre le tableau suivant.
Utilisation des simples quotes | char c = 'a'; |
---|---|
Utilisation du code numérique du caractère | char c = 97; // le code 97 correspond au caractère a |
Utilisation de la notation unicode de Java (sur 4 digits et en hexadécimal) |
char c = '\u0061'; // Encore une fois le caractère a |
Utilisation de caractères spéciaux | char c1 = '\n'; // Un retour à la ligne char c2 = '\t'; // Une tabulation char c3 = '\\'; // Tout simplement un \ char c4 = '\''; // Un caractère ' |
Vos fichiers de code source Java seront souvent des fichiers 8 bits (UTF-8 ou ISO-8859-1, très certainement).
Du coup, le langage Java permet de définir n'importe quel caractère UTF-16 via la syntaxe \u.
Par exemple la séquence \u0041
vous permettra de représenter le caractère A (exprimée en hexadécimal et sur quatre digits).
Voici un petit exemple d'utilisation de caractères.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class TypeCharacter { public static void main(String[] args) { // Attention entre chaîne de caractères (") et caractère (') String theStr = "Une chaine de caractères \u03a0"; // Un ensemble de caractères char theChar = 'a'; // Un unique caractère System.out.println( theStr + " vs " + theChar ); // La syntaxe est héritée de C => on retrouve les mêmes séquences pour certains caractères spéciaux. char retourALaLigne = '\n'; char tabulation = '\t'; // '\0' System.out.println( "BEGIN" + retourALaLigne + "MIDDLE" + tabulation + "END" ); // Exemple d'utilisation de caractères étendus. // Ici caractères PI en minuscule et en majuscule. char piMaj = '\u03a0'; //char piMin = '\u03c0'; // Codification en hexadécimal char piMin = 960; // Codification en décimal System.out.println( piMaj + " - " + piMin ); } } |
La classe java.lang.Character
propose un certain nombre de méthodes statiques vous permettant de tester vos caractères et ce
quel que soit l'alphabet utilisé.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class TypeCharacter { public static void main(String[] args) { char theChar = 'a'; char piMaj = '\u03a0'; char piMin = '\u03c0'; // Des méthodes statiques vous sont proposées pour tester vos caractères. boolean isDigit = Character.isDigit( theChar ); System.out.println( isDigit ); // false boolean isLetter = Character.isLetter( piMaj ); System.out.println( isLetter ); // true boolean isUpperCaseLetter = Character.isUpperCase( piMin ); System.out.println( isUpperCaseLetter ); // false } } |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :