1. Redenen om karakters te escapen

Er was eens dat je, om een ​​reeks tekens in code te schrijven, deze tussen dubbele aanhalingstekens moet plaatsen. Het resultaat is een letterlijke tekenreeks .

Maar wat doen we als we aanhalingstekens nodig hebben binnen een letterlijke tekenreeks? Een string met aanhalingstekens — wat is er eenvoudiger?

Laten we zeggen dat we de tekst willen weergeven "Friends" was nominated for an "Oscar". Hoe doe je dat?

Code Notities
String s = ""Friends" was nominated for an "Oscar"";
Deze optie werkt niet!

Het probleem is dat de compiler denkt dat je totaal onverwachte code schrijft:

Code Notities
String s = ""Friends" was nominated for an "Oscar"";
Deze optie werkt niet!

Nadat de compiler dubbele aanhalingstekens in de code tegenkomt, behandelt het wat volgt als het begin van een letterlijke tekenreeks. Het volgende dubbele aanhalingsteken geeft het einde van de letterlijke tekenreeks aan.

Dus hoe schrijf je dubbele aanhalingstekens in een letterlijke zin?


2. Ontsnappende karakters

Er is een weg. Het wordt escape-tekens genoemd . U schrijft gewoon de aanhalingstekens in de tekstreeks. En voor de aanhalingstekens voeg je het \( backslash ) symbool toe.

Zo ziet de letterlijke tekenreeks eruit als deze correct is geschreven:

Code Notities
String s = "\"Friends\" was nominated for an \"Oscar\"";
Dit zal werken!

De compiler interpreteert alles correct en beschouwt het aanhalingsteken na de backslash niet als een normaal aanhalingsteken.

Bovendien, als u deze string naar het scherm uitvoert, worden de aanhalingstekens met backslashes correct verwerkt en wordt de tekst zonder backslashes weergegeven:"Friends" was nominated for an "Oscar"

Nog een belangrijk punt. Een aanhalingsteken voorafgegaan door een backslash vertegenwoordigt een enkel teken: we gebruiken gewoon een gelikte notatie die het vermogen van de compiler om letterlijke tekenreeksen in onze code te herkennen niet verstoort. U kunt aanhalingstekens toekennen aan een charvariabele:

Code Notities
char c = '\"';
\"is één teken, niet twee
char c = '"';
Dit kan ook: een dubbel aanhalingsteken binnen enkele aanhalingstekens

3. Veelvoorkomende situaties die zich voordoen bij het ontsnappen aan tekens

Veelvoorkomende situaties waarbij ontsnappende karakters betrokken zijn

Naast dubbele aanhalingstekens zijn er veel andere tekens die de compiler op een speciale manier verwerkt. Bijvoorbeeld een regeleinde.

Hoe voegen we een regeleinde toe aan een literal? Ook hiervoor is er een speciale combinatie:

\n
Regeleinde karakter

Als u een regeleinde aan een letterlijke tekenreeks wilt toevoegen, hoeft u slechts een paar tekens toe te voegen: \n.

Voorbeeld:

Code Console-uitvoer
System.out.println("Best regards, \n Anonymous");
Best regards,
Anonymous

Er zijn in totaal 8 van dit soort speciale combinaties, ook wel ontsnappingsreeksen genoemd . Daar zijn ze:

Code Beschrijving
\t Voeg een tabteken in
\b Voeg een backspace- teken in
\n Voeg een teken voor een nieuwe regel in
\r Voeg een regelterugloopteken in
\f Voeg een paginafeed- teken in
\' Voeg een enkel aanhalingsteken in
\" Voeg een dubbel aanhalingsteken in
\\ Voeg een backslash in

Je kent er twee, maar wat betekenen de andere zes?

\tis een tabteken

Wanneer deze tekst in tekst verschijnt, is dit gelijk aan het indrukken van de Tabtoets tijdens het typen. Het verschuift de tekst die erop volgt en maakt het mogelijk om tekst uit te lijnen.

Voorbeeld:

Code Console-uitvoer
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

\bbetekent 'één teken teruggaan'

Deze reeks in een string komt overeen met het indrukken van de Backspacetoets op het toetsenbord. Het verwijdert het karakter dat eraan voorafgaat:

Code Console-uitvoer
System.out.println("Hello\b\b World");
Hell World!

\ris het regelterugloopteken

Dit teken verplaatst de cursor naar het begin van de huidige regel zonder de tekst te wijzigen. Wat hierna wordt weergegeven, zal de bestaande tekenreeks overschrijven.

Voorbeeld:

Code Console-uitvoer
System.out.println("Greetings\r World!");
World!

\fis een paginafeed-teken

Dit symbool stamt uit de tijd van de eerste matrixprinters. Het uitvoeren van deze volgorde naar een printer zou ervoor zorgen dat de printer gewoon het huidige vel invoert, zonder enige tekst af te drukken, totdat een nieuwe pagina begint.

Nu zouden we het een pagina-einde of nieuwe pagina noemen .

\\is een backslash

Alles is hier eenvoudig. Als we een backslash gebruiken om tekens in onze tekst te escapen, hoe schrijven we dan zelf een backslash-teken in de string?

Het is simpel: voeg een backslash toe aan de tekst — je moet er twee achter elkaar schrijven.

Voorbeeld:

Code Console-uitvoer
System.out.println("c:\projects\my\first");
De compiler zal tegen je schreeuwen voor onbekende ontsnapte karakters.
System.out.println("c:\\projects\\my\\first");
Zo is het goed gedaan!


4. Unicode-codering

Zoals u al weet, komt elk teken dat op het scherm wordt weergegeven overeen met een specifieke numerieke code. Een gestandaardiseerde set van deze codes wordt een codering genoemd .

Er was eens, toen computers nieuw werden uitgevonden, zeven bits (minder dan één byte) genoeg om elk teken te coderen. De eerste codering bevatte slechts 128 tekens. Deze codering werd ASCII genoemd .

ASCII staat voor American Standard Code for Information Interchange — een standaard Amerikaanse codetabel voor afdrukbare tekens en enkele speciale codes.

Het bestaat uit 33 niet-afdrukbare controletekens (die van invloed zijn op hoe tekst en spaties worden verwerkt) en 95 afdrukbare tekens, waaronder cijfers, Latijnse hoofdletters en kleine letters, en verschillende leestekens.

Unicode-codering

Naarmate computers steeds populairder werden, begon elk land zijn eigen codering vrij te geven. Meestal namen ze ASCII als uitgangspunt en vervingen ze zelden gebruikte ASCII-tekens door symbolen uit hun respectieve alfabetten.

Na verloop van tijd ontstond er een idee: maak een enkele codering die alle karakters van elke codering ter wereld bevat.

Unicode-codering 1

Zo werd in 1993 de Unicode- codering gemaakt en werd de Java-taal de eerste programmeertaal die deze codering gebruikte als standaard voor het opslaan van tekst. Nu is Unicode de standaard voor de hele IT-industrie.

Hoewel Unicode zelf de standaard is, heeft het verschillende weergaven of Unicode-transformatieformaten (UTF): UTF-8, UTF-16 en UTF-32, enz.

Java gebruikt een geavanceerde versie van Unicode-codering — UTF-16: elk teken is gecodeerd in 16 bits (2 bytes). Het is geschikt voor maximaal 65.536 tekens!

Je kunt bijna elk teken van elk alfabet ter wereld in deze codering vinden. Natuurlijk heeft niemand alles uit het hoofd geleerd. Je kunt niet alles weten, maar je kunt wel alles googlen.

Om een ​​Unicode-teken in uw programma te schrijven met behulp van de code, moet u \u+ de code in hexadecimaal schrijven . Bijvoorbeeld,\u00A9

Code Console-uitvoer
System.out.println("\u00A9 CodeGym");
© CodeGym


5. Unicode: codepunt

"640 kilobytes zou genoeg moeten zijn voor iedereen! Of niet". (Citaat toegeschreven aan Bill Gates)

Het leven is ruw en na verloop van tijd begon de UTF-16-codering ontoereikend te worden. Het blijkt dat er veel Aziatische talen zijn en dat ze veel glyphs hebben. En al deze glyphs kunnen eenvoudigweg niet in 2 bytes worden gepropt.

Wat gedaan kan worden? Gebruik meer bytes !

Maar het char-type is slechts 2 bytes en het veranderen in 4 is niet zo eenvoudig: er zijn miljarden regels Java-code over de hele wereld geschreven, die kapot zouden gaan als het char-type plotseling 4 bytes wordt in een Java-machine. We kunnen het tekentype dus niet wijzigen!

Er is een andere benadering. Onthoud hoe we karakters ontlopen door er een backslash voor te zetten. Kortom, we hebben een enkel teken gecodeerd met meerdere tekens.

De makers van Java besloten om dezelfde aanpak te gebruiken.

Sommige tekens die visueel als een enkel teken verschijnen, zijn gecodeerd als twee chars in een string:

Code Console-uitvoer
System.out.println("\uD83D\uDD0A");
🔊

Nu kan je Java-programma zelfs emoji's uitvoeren naar de console 😎