Participer au site avec un Tip
Rechercher
 

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 :

Manipulation de caractères en Java

Le type boolean Les chaînes de caractères



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

La vidéo

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.


Manipulation de caractères en Java

Rappels sur les standards d'encodage de caractères

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.

La table ASCII

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.

Là, vous vous dites « et s'il y a deux permutations de bits sur le caractère durant le transport ? »
Bonne remarque et dans ce cas là le problème n'était pas détecté. Mais la probabilité était très faible.

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
Les cellules d'entêtes vous permettent de trouver la valeur (en hexadécimal) du caractère considéré. Ainsi 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

Les tables d'encodage dérivées d'ASCII (ISO-8859-1, ...)

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.

Le standard Unicode - ISO/CEI-10646

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.

Bien entendu, la table Unicode est une extension la table ASCII. Les 128 premiers caractères sont donc les mêmes. Vous pouvez les consulter dans le tableau ci-dessus.

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

Utilisation du type char

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 );

    }
    
}
selon la configuration de votre système d'exploitation, il est possible que les deux derniers caractères ne s'affichent pas correctement. Effectivement, faut-il que vous ayez une police de caractères connaissant les glyphes de caractères que vous utilisez (ici des caractères Grecs). Normalement, sous Linux, les choses se passent bien.

Quelques méthodes de tests de vos caractères

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

    }
    
}


Le type boolean Les chaînes de caractères