JavaRush /Blog Java /Random-FR /Caractères en fuite

Caractères en fuite

Publié dans le groupe Random-FR
Bonjour! Dans les cours précédents, nous nous sommes déjà familiarisés avec les chaînes représentées par la classe en Java String. Comme vous vous en souvenez probablement, une chaîne est une séquence de caractères. Les symboles peuvent être n'importe quoi : des lettres, des chiffres, des signes de ponctuation, etc. L'essentiel est que lors de la création d'une chaîne, toute la séquence est mise entre guillemets :
public class Main {
   public static void main(String[] args) {
       String sasha = new String ("Меня зовут Саша, мне 20 лет!");
   }
}
Mais que se passe-t-il si nous devons créer une chaîne contenant également des guillemets ? Par exemple, nous voulons parler au monde de notre livre préféré :
public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - "Сумерки" Стефани Майер");
   }
}
Le compilateur semble mécontent de quelque chose ! Selon vous, quelle pourrait être la raison de l'erreur et pourquoi s'est-elle produite spécifiquement avec les guillemets ? Le fait est que le compilateur perçoit les guillemets d'une manière strictement définie, à savoir qu'il y enveloppe une chaîne. Et chaque fois qu'il voit un caractère ", il s'attend à ce que le même caractère suive, et entre eux il y aura le texte de la ligne que lui, le compilateur, doit créer. Dans notre cas, les guillemets autour du mot « Twilight » sont à l’intérieur d’autres guillemets . Et lorsque le compilateur arrive à ce morceau de texte, il ne comprend tout simplement pas ce qu'il en attend. Il semble qu'il y ait un guillemet, ce qui signifie qu'il devrait créer une chaîne. Mais il le fait déjà ! C'est précisément la raison. En termes simples, à ce stade, le compilateur ne comprend pas ce qu'il en attend. "Une autre citation ? Est-ce une sorte d'erreur ? Je suis déjà en train de créer une chaîne ! Ou devrais-je en créer une autre ? Uhhh...:/" Nous devons expliquer au compilateur quand une citation est une commande pour celle-ci (" créez une chaîne ! »), et lorsqu'il s'agit d'un simple symbole (« affichez le mot « Twilight » accompagné de guillemets ! »). Pour y parvenir, Java utilise des caractères d'échappement . Cela se fait à l'aide d'un caractère spécial. Comme ça: \. Dans la vie ordinaire, cela s'appelle une "barre oblique inverse", mais en Java, cela (en combinaison avec le caractère à échapper) est appelé une séquence d'échappement . Par exemple, \"la voici : une séquence de contrôle pour afficher les cotations à l'écran. Ayant rencontré une telle construction dans votre code, le compilateur comprendra qu'il s'agit simplement d'un caractère « guillemet » qui doit être affiché à l'écran. Essayons de changer notre code avec le livre :
public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - \"Сумерки\" Стефани Майер");
       System.out.println(myFavoriteBook);
   }
}
Nous avons échappé aux deux guillemets "intérieurs" avec un \. Essayons d'exécuter la méthode main()... Sortie de la console :

Моя любимая книга - "Сумерки" Стефани Майер
Super, le code a fonctionné exactement comme nécessaire ! Les guillemets sont loin d'être le seul cas où nous pouvons avoir besoin d'un caractère qui s'échappe. Par exemple, nous voulions parler de notre travail à quelqu’un :
public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
Et encore une erreur ! Pouvez-vous déjà deviner quelle en est la raison ? Encore une fois, le compilateur ne comprend pas quoi faire. Après tout, un symbole \pour lui n'est rien d'autre qu'une séquence de contrôle ! Il s'attend à ce qu'après la barre oblique, il y ait un caractère qu'il devra interpréter d'une manière spéciale (par exemple, un guillemet). Cependant, ici, \les lettres régulières suivent. Le compilateur est donc à nouveau confus. Ce qu'il faut faire? Exactement la même chose que la dernière fois : il suffit d'en ajouter \un de plus au nôtre \!
public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
Voyons ce qui en résulte : Sortie de la console :

Мои рабочие файлы лежат в папке D:\Work Projects\java
Super! Le compilateur a immédiatement déterminé qu'il \s'agissait de symboles ordinaires qui devaient être affichés sur la console avec le reste. Il existe de nombreuses séquences d'échappement en Java. Voici leur liste complète :
  • \t caractère de tabulation.
  • \b un caractère de retour dans le texte un pas en arrière ou la suppression d'un caractère dans une ligne (retour arrière).
  • \n caractère de nouvelle ligne.
  • \r caractère de retour chariot.
  • \f exécution de la page.
  • \' caractère guillemet simple.
  • \" caractère guillemet double.
  • \\caractère barre oblique inverse (\).
Ainsi, si le compilateur rencontre un symbole dans le texte \n, il comprendra qu'il ne s'agit pas simplement d'un symbole et d'une lettre qui doivent être affichés sur la console, mais d'une commande spéciale pour celui-ci - "faire un saut de ligne !" Par exemple, cela peut nous être utile si nous voulons afficher un morceau de poème sur la console :
public class Main {
   public static void main(String[] args) {
       String borodino = new String ("Скажи-ка, дядя, \nВедь не даром \nМосква, спаленная пожаром, \nФранцузу отдана?");
       System.out.println(borodino);
   }
}
Et voici ce que nous avons obtenu : Sortie de la console :

Скажи-ка, дядя, 
Ведь не даром 
Москва, спаленная пожаром, 
Французу отдана?
Exactement ce qu'il faut ! Le compilateur a reconnu la séquence d'échappement et a généré un morceau de vers en 4 lignes.

Unicode

Un autre sujet important que vous devez connaître en ce qui concerne l'échappement de caractères est Unicode . Unicode est une norme de codage de caractères qui inclut des caractères de presque toutes les langues écrites du monde. En d’autres termes, il s’agit d’une liste de codes spéciaux, dans laquelle se trouve un code pour presque tous les caractères de n’importe quelle langue ! Naturellement, cette liste est très longue et personne ne l'apprend par cœur :) Si vous souhaitez savoir d'où elle vient et pourquoi elle était nécessaire, lisez l'article informatif sur Habrahabr . Tous les codes de caractères en Unicode sont « lettre u+ chiffre hexadécimal ». Par exemple, le célèbre symbole du droit d'auteur est indiqué par le code u00A9 . Ainsi, si vous devez utiliser ce caractère lorsque vous travaillez avec du texte en Java, vous pouvez l'échapper dans votre texte ! Par exemple, nous voulons que tout le monde sache que cette conférence est protégée par les droits d'auteur de JavaRush :
public class Main {
   public static void main(String[] args) {
       System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
   }
}
Sortie de la console :

Лекция "Экранирование символов", © 2018 Javarush
Super, tout s'est bien passé ! Mais les personnages spéciaux ne font pas tout ! En utilisant Unicode et l'échappement de caractères, vous pouvez encoder du texte écrit dans différentes langues en même temps. Et même dans plusieurs dialectes différents d’une même langue !
public class Main {
   public static void main(String[] args) {

       System.out.println("\u041c\u0430\u0301\u043e " +
               "\u0426\u0437\u044d\u0434\u0443\u0301\u043d " +
               "\u0028\u043a\u0438\u0442\u002e \u0442\u0440\u0430\u0434\u002e " +
               "\u6bdb\u6fa4\u6771\u002c \u0443\u043f\u0440\u002e " +
               "\u6bdb\u6cfd\u4e1c\u002c \u043f\u0438\u043d\u044c\u0438\u043d\u044c\u003a " +
               "\u004d\u00e1\u006f \u005a\u00e9\u0064\u014d\u006e\u0067\u0029 " +
               "\u2014 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 " +
               "\u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 " +
               "\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 " +
               "\u0434\u0435\u044f\u0442\u0435\u043b\u044c \u0058\u0058 \u0432\u0435\u043a\u0430\u002c " +
               "\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u043a " +
               "\u043c\u0430\u043e\u0438\u0437\u043c\u0430\u002e");
   }
}
Sortie de la console :

Ма́о Цзэду́н (кит. трад. 毛澤東, упр. 毛泽东, пиньинь: Máo Zédōng) — китайский государственный и политический деятель XX века, главный теоретик маоизма.
Dans cet exemple, connaissant les codes de caractères, nous avons écrit une chaîne composée de l'alphabet cyrillique et de trois (!) types différents d'écriture de caractères chinois - classique, simplifié et latin (pinyin). C'est en gros ça ! Vous en savez maintenant suffisamment sur l'évasion de caractères pour utiliser cet outil dans votre travail :) Si tout n'est pas complètement clair, je vous conseille de lire cet article : ce sera un bon complément.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION