CodeGym /Java Blog /Willekeurig /Java Escape-tekens
John Squirrels
Niveau 41
San Francisco

Java Escape-tekens

Gepubliceerd in de groep Willekeurig
Hoi! In eerdere lessen hebben we al kennis gemaakt met tekenreeksen, die in Java worden weergegeven door de klasse String . Zoals je je waarschijnlijk herinnert, is een string een reeks tekens. Deze tekens kunnen letters, cijfers, leestekens enzovoort zijn. Het belangrijkste bij het maken van een string is dat de hele reeks tussen aanhalingstekens moet staan:

public class Main {
   public static void main(String[] args) {
       String alex = new String ("My name is Alex. I'm 20!");
   }
}
Maar wat doen we als we een string moeten maken die zelf aanhalingstekens moet bevatten? Stel dat we de wereld willen vertellen over uw favoriete boek:

public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("My favorite book is "Twilight" by Stephanie Meyer");
   }
}
Het lijkt erop dat de compiler ergens niet blij mee is! Wat denk je dat het probleem zou kunnen zijn? En wat heeft dat met aanhalingstekens te maken? Eigenlijk is het allemaal heel simpel. De compiler interpreteert aanhalingstekens op een heel specifieke manier, dwz het verwacht dat er strings in worden gewikkeld. En elke keer dat de compiler " ziet, verwacht hij dat het aanhalingsteken wordt gevolgd door een tweede aanhalingsteken, en dat de inhoud ertussen de tekst is van een string die door de compiler moet worden gemaakt. In ons geval zijn de aanhalingstekens rond het woord "Twilight" staan ​​tussen andere aanhalingstekens . Wanneer de compiler dit stuk tekst bereikt, begrijpt het gewoon niet wat het moet doen. Het aanhalingsteken suggereert dat er een string moet worden gemaakt. Maar dat is wat de compiler is alaan het doen! Dit is waarom: eenvoudig gezegd raakt de compiler in de war over wat er van hem wordt verwacht. "Nog een aanhalingsteken? Is dit een vergissing? Ik ben al een string aan het maken! Of moet ik er nog een maken? Argh!...:/" We moeten de compiler laten weten wanneer een aanhalingsteken een opdracht is ( "maak een string!") en wanneer het gewoon een karakter is ("toon het woord "Twilight" samen met aanhalingstekens!"). Om dit te doen, gebruikt Java karakter-escaping . Dit wordt bereikt met behulp van een speciaal symbool: \ . Dit symbool wordt gewoonlijk "backslash" genoemd. In Java wordt een backslash in combinatie met een teken dat moet worden "ontsnapt" een besturingsreeks genoemd . Bijvoorbeeld \"is een besturingsreeks voor het weergeven van aanhalingstekens op het scherm. Bij het tegenkomen van deze constructie in uw code, zal de compiler begrijpen dat dit slechts een aanhalingsteken is dat op het scherm moet worden weergegeven. Laten we proberen onze code te veranderen met het boek:

public static void main(String[] args) {
       String myFavoriteBook = new String ("My favorite book is \"Twilight\" by Stephanie Meyer");
       System.out.println(myFavoriteBook);
   }
}
We hebben \ gebruikt om onze twee "interne" aanhalingstekens te omzeilen. Laten we proberen de methode main() uit te voeren ... Console-uitvoer:
My favorite book is "Twilight" by Stephanie Meyer
Uitstekend! De code werkte precies zoals we wilden! Aanhalingstekens zijn zeker niet de enige tekens die we nodig hebben om te ontsnappen. Stel dat we iemand over ons werk willen vertellen:

public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("My work files are in D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
Nog een fout! Kun je raden waarom? Nogmaals, de compiler begrijpt niet wat hij moet doen. De compiler kent tenslotte niets anders dan een besturingsreeks ! Het verwacht dat de backslash wordt gevolgd door een bepaald teken dat het op de een of andere manier op een speciale manier moet interpreteren (zoals een aanhalingsteken). Maar in dit geval wordt \ gevolgd door gewone letters. Dus de compiler is weer in de war. Wat moeten we doen? Precies hetzelfde als voorheen: we voegen gewoon nog een \ toe aan onze \ !

public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("My work files are in D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
Laten we eens kijken wat we krijgen: Console-uitvoer:
My work files are in D:\Work Projects\java
Super! De compiler stelt onmiddellijk vast dat de \ gewone tekens zijn die samen met de rest moeten worden weergegeven. Java heeft nogal wat besturingssequenties. Hier is de volledige lijst:
  • \t - tabblad.
  • \b - backspace (een stap terug in de tekst of het verwijderen van een enkel teken).
  • \n - nieuwe regel.
  • \r - regelterugloop. ()
  • \f - formulierfeed.
  • \' enkel aanhalingsteken.
  • \" dubbel aanhalingsteken.
  • \\ backslash.
Dus als de compiler \n in de tekst tegenkomt, begrijpt hij dat dit niet alleen een symbool en een letter is om op de console weer te geven, maar eerder een speciaal commando om "naar een nieuwe regel te gaan!". Dit kan bijvoorbeeld handig zijn als we een deel van een gedicht willen weergeven:

public class Main {
   public static void main(String[] args) {
       String byron = new String ("She walks in beauty, like the night, \nOf cloudless climes and starry skies\nAnd all that's best of dark and bright\nMeet in her aspect and her eyes...");
       System.out.println(byron);
   }
}
Dit is wat we krijgen: Console-uitvoer:
She walks in beauty, like the night, 
Of cloudless climes and starry skies 
And all that's best of dark and bright 
Meet in her aspect and her eyes...
Precies wat we wilden! De compiler herkende de ontsnappingsreeks en voerde een uittreksel van het gedicht uit op 4 regels.

Ontsnap aan Unicode-tekens

Een ander belangrijk onderwerp dat u moet weten in verband met escape-tekens, is Unicode. Unicode is een standaard tekencodering die de symbolen van bijna elke geschreven taal ter wereld bevat. Met andere woorden, het is een lijst met speciale codes die bijna elk teken in elke taal vertegenwoordigen! Dit is natuurlijk een erg lange lijst en niemand leert het uit het hoofd :) Als je wilt weten waar het vandaan komt en waarom het nodig is geworden, lees dan dit informatieve artikel: https://docs.oracle.com/javase/tutorial/ i18n/text/unicode.html Alle Unicode-tekencodes hebben de vorm " u+<hexadecimaal cijfer>". Het bekende copyright-symbool wordt bijvoorbeeld weergegeven door u00A9. Dus als u dit teken moet gebruiken bij het werken met tekst in Java, kunt u het in uw tekst laten ontsnappen! We willen bijvoorbeeld om iedereen te informeren dat CodeGym het auteursrecht op deze les bezit:

public class Main {
   public static void main(String[] args) {
       System.out.println("\"Escaping characters\", \u00A9 2019 CodeGym");
   }
}
Console-uitvoer:
"Escaping characters", © 2019 CodeGym
Super, het is allemaal gelukt! Maar het gaat niet alleen om speciale symbolen! U kunt Unicode en escape-tekens gebruiken om tekst te coderen die gelijktijdig in verschillende talen is geschreven. En zelfs tekst geschreven in verschillende dialecten van dezelfde taal!

public class Main {
   public static void main(String[] args) {

       System.out.println("\u004d\u0061\u006f \u005a\u0065\u0064\u006f\u006e\u0067 " + 

               "\u0028\u0054\u0072\u0061\u0064\u0069\u0074\u0069\u006f\u006e\u0061\u006c " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065\u003a \u6bdb\u6fa4\u6771\u002c " +

               "\u0053\u0069\u006d\u0070\u006c\u0069\u0066\u0069\u0065\u0064 " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065\u003a \u6bdb\u6cfd\u4e1c\u002c " +

               "\u0050\u0069\u006e\u0079\u0069\u006e\u003a \u004d\u00e1\u006f " +

               "\u005a\u00e9\u0064\u014d\u006e\u0067\u0029 \u0077\u0061\u0073 \u0061 " +

               "\u0032\u0030\u0074\u0068\u002d\u0063\u0065\u006e\u0074\u0075\u0072\u0079 " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065 " +

                "\u0073\u0074\u0061\u0074\u0065\u0073\u006d\u0061\u006e\u002c " +

               "\u0070\u006f\u006c\u0069\u0074\u0069\u0063\u0069\u0061\u006e\u002c " +

               "\u0061\u006e\u0064 \u0074\u0068\u0065 \u0063\u0068\u0069\u0065\u0066 " +

               "\u0074\u0068\u0065\u006f\u0072\u0065\u0074\u0069\u0063\u0069\u0061\u006e " +

               "\u006f\u0066 \u004d\u0061\u006f\u0069\u0073\u006d\u002e");
   }
}
Console-uitvoer:
Mao Zedong (Traditional Chinese: 毛澤東, Simplified Chinese: 毛泽东, Pinyin: Máo Zédōng) was a 20th-century Chinese statesman, politician, and the chief theoretician of Maoism.
In dit voorbeeld hebben we karaktercodes gebruikt om een ​​string samen te stellen die bestaat uit Engelse en drie(!) verschillende soorten Chinese karakters — traditioneel, vereenvoudigd en Latijns (Pinyin). En dat vat het zo ongeveer samen! Nu weet je genoeg over het ontsnappen aan karakters om deze geweldige tool in je werk te gebruiken :) Om te versterken wat je hebt geleerd, raden we je aan een videoles van onze Java-cursus te bekijken
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION