1. Raisons des caractères d'échappement

Il était une fois, vous avez appris que pour écrire une chaîne de caractères dans le code, vous devez les envelopper de guillemets doubles. Le résultat est un littéral de chaîne .

Mais que faire si nous avons besoin de guillemets à l'intérieur d'une chaîne littérale ? Une chaîne contenant des guillemets — quoi de plus simple ?

Disons que nous voulons afficher le texte "Friends" was nominated for an "Oscar". Comment tu fais ça?

Code Remarques
String s = ""Friends" was nominated for an "Oscar"";
Cette option ne fonctionnera pas !

Le problème est que le compilateur pense que vous écrivez un code complètement inattendu :

Code Remarques
String s = ""Friends" was nominated for an "Oscar"";
Cette option ne fonctionnera pas !

Lorsque le compilateur rencontre des guillemets doubles dans le code, il traite ce qui suit comme le début d'un littéral de chaîne. Le guillemet double suivant indique la fin du littéral de chaîne.

Alors, comment écrivez-vous des guillemets doubles à l'intérieur d'un littéral?


2. Caractères d'échappement

Il y a un moyen. C'est ce qu'on appelle les caractères d'échappement . Vous écrivez simplement les guillemets dans la chaîne de texte. Et avant les guillemets, vous ajoutez le symbole \( barre oblique inverse ).

Voici à quoi ressemble le littéral de chaîne lorsqu'il est écrit correctement :

Code Remarques
String s = "\"Friends\" was nominated for an \"Oscar\"";
Cela fonctionnera !

Le compilateur interprétera tout correctement et ne considérera pas le guillemet après la barre oblique inverse comme un guillemet normal.

De plus, si vous affichez cette chaîne à l'écran, les guillemets avec des barres obliques inverses seront traités correctement et le texte s'affichera sans aucune barre oblique inverse :"Friends" was nominated for an "Oscar"

Autre point important. Un guillemet précédé d'une barre oblique inverse représente un seul caractère : nous utilisons simplement une notation astucieuse qui n'interfère pas avec la capacité du compilateur à reconnaître les littéraux de chaîne dans notre code. Vous pouvez attribuer des guillemets à une charvariable :

Code Remarques
char c = '\"';
\"est un caractère, pas deux
char c = '"';
C'est aussi possible : un guillemet double à l'intérieur de guillemets simples

3. Situations courantes qui se produisent lors de l'échappement de caractères

Situations courantes impliquant des caractères d'échappement

En plus des guillemets doubles, il existe de nombreux autres caractères que le compilateur gère d'une manière spéciale. Par exemple, un saut de ligne.

Comment ajouter un saut de ligne à un littéral ? Il existe également une combinaison spéciale pour cela:

\n
Caractère de saut de ligne

Si vous avez besoin d'ajouter un saut de ligne à un littéral de chaîne, il vous suffit d'ajouter quelques caractères : \n.

Exemple:

Code Sortie console
System.out.println("Best regards, \n Anonymous");
Best regards,
Anonymous

Il existe au total 8 combinaisons spéciales comme celle-ci, également appelées séquences d'échappement . Les voici:

Code Description
\t Insérer un caractère de tabulation
\b Insérer un caractère de retour arrière
\n Insérer un caractère de nouvelle ligne
\r Insérer un caractère de retour chariot
\f Insérer un caractère de saut de page
\' Insérer un guillemet simple
\" Insérer un guillemet double
\\ Insérer une barre oblique inverse

Vous en connaissez deux, mais que signifient les 6 autres ?

\test un caractère de tabulation

Lorsque ce texte apparaît dans le texte, cela équivaut à appuyer sur la Tabtouche lors de la saisie. Il décale le texte qui le suit et permet d'aligner le texte.

Exemple:

Code Sortie console
System.out.println("0\t1\t2\t3");
System.out.println("0\t10\t20\t30");
System.out.println("0\t100\t200\t300");
0       1        2        3
0       10       20       30
0       100      200      300

\bsignifie "revenir en arrière d'un caractère"

Cette séquence dans une chaîne équivaut à appuyer Backspacesur la touche du clavier. Il supprime le caractère qui le précède :

Code Sortie console
System.out.println("Hello\b\b World");
Hell World!

\rest le caractère de retour chariot

Ce caractère déplace le curseur au début de la ligne courante sans modifier le texte. Tout ce qui est ensuite affiché écrasera la chaîne existante.

Exemple:

Code Sortie console
System.out.println("Greetings\r World!");
World!

\fest un caractère de saut de page

Ce symbole nous vient de l'époque des premières imprimantes matricielles. La sortie de cette séquence sur une imprimante amènerait l'imprimante à simplement sortir la feuille actuelle, sans imprimer de texte, jusqu'à ce qu'une nouvelle page commence.

Maintenant, nous appellerions cela un saut de page ou une nouvelle page .

\\est une barre oblique inverse

Tout est simple ici. Si nous utilisons une barre oblique inverse pour échapper des caractères dans notre texte, alors comment écrivons-nous un caractère barre oblique inverse lui-même dans la chaîne ?

C'est simple : ajoutez une barre oblique inverse au texte — vous devez en écrire deux à la suite.

Exemple:

Code Sortie console
System.out.println("c:\projects\my\first");
Le compilateur vous criera dessus pour les caractères échappés inconnus.
System.out.println("c:\\projects\\my\\first");
C'est comme ça que c'est bien fait !


4. Encodage Unicode

Comme vous le savez déjà, chaque caractère affiché à l'écran correspond à un code numérique spécifique. Un ensemble standardisé de ces codes est appelé un codage .

Il était une fois, lorsque les ordinateurs venaient d'être inventés, sept bits (moins d'un octet) suffisaient pour coder chaque caractère. Le premier encodage ne contenait que 128 caractères. Ce codage s'appelait ASCII .

ASCII signifie American Standard Code for Information Interchange - une table de codes américaine standard pour les caractères imprimables et certains codes spéciaux.

Il se compose de 33 caractères de contrôle non imprimables (qui affectent le traitement du texte et des espaces) et de 95 caractères imprimables, y compris des chiffres, des lettres latines majuscules et minuscules et plusieurs signes de ponctuation.

Encodage Unicode

Au fur et à mesure que les ordinateurs gagnaient en popularité, chaque pays a commencé à publier son propre encodage. Habituellement, ils prenaient l'ASCII comme point de départ et remplaçaient les caractères ASCII rarement utilisés par des symboles de leurs alphabets respectifs.

Au fil du temps, une idée a émergé : créer un encodage unique qui contienne tous les caractères de tous les encodages du monde.

Codage Unicode 1

Ainsi, en 1993, l' encodage Unicode a été créé, et le langage Java est devenu le premier langage de programmation à utiliser cet encodage comme standard pour stocker du texte. Désormais, Unicode est la norme pour l'ensemble de l'industrie informatique.

Bien qu'Unicode lui-même soit la norme, il a plusieurs représentations ou formats de transformation Unicode (UTF) : UTF-8, UTF-16 et UTF-32, etc.

Java utilise une version avancée de l'encodage Unicode — UTF-16 : chaque caractère est encodé sur 16 bits (2 octets). Il peut accueillir jusqu'à 65 536 caractères !

Vous pouvez trouver presque tous les caractères de tous les alphabets du monde dans cet encodage. Naturellement, personne n'a tout mémorisé. Vous ne pouvez pas tout savoir, mais vous pouvez tout rechercher sur Google.

Pour écrire un caractère Unicode dans votre programme en utilisant son code, vous devez écrire \u+ le code en hexadécimal . Par exemple,\u00A9

Code Sortie console
System.out.println("\u00A9 CodeGym");
© CodeGym


5. Unicode : point de code

"640 kilo-octets devraient suffire à tout le monde ! Ou pas". (Citation attribuée à Bill Gates)

La vie est rude, et au fil du temps, l'encodage UTF-16 a commencé à être inadéquat. Il s'avère qu'il y a beaucoup de langues asiatiques et qu'elles ont beaucoup de glyphes. Et tous ces glyphes ne peuvent tout simplement pas être entassés sur 2 octets.

Ce qui peut être fait? Utilisez plus d'octets !

Mais le type char ne fait que 2 octets et le changer en 4 n'est pas si facile : des milliards de lignes de code Java ont été écrites dans le monde entier, ce qui se briserait si le type char devenait soudainement 4 octets sur une machine Java. Nous ne pouvons donc pas changer le type de caractère !

Il existe une autre approche. Rappelez-vous comment nous échappons aux caractères en mettant une barre oblique inverse devant eux. Fondamentalement, nous avons encodé un seul caractère en utilisant plusieurs caractères.

Les créateurs de Java ont décidé d'utiliser la même approche.

Certains caractères qui apparaissent visuellement comme un seul caractère sont codés comme deux chars dans une chaîne :

Code Sortie console
System.out.println("\uD83D\uDD0A");
🔊

Maintenant, votre programme Java peut même envoyer des emojis à la console 😎