1. Motive pentru evadarea caracterelor

Cândva, ați învățat că, pentru a scrie un șir de caractere în cod, trebuie să le înfășurați între ghilimele duble. Rezultatul este un șir literal .

Dar ce facem dacă avem nevoie de ghilimele în interiorul unui șir literal? Un șir care conține ghilimele — ce ar putea fi mai ușor?

Să presupunem că vrem să afișăm textul "Friends" was nominated for an "Oscar". Cum faci asta?

Cod Note
String s = ""Friends" was nominated for an "Oscar"";
Această opțiune nu va funcționa!

Problema este că compilatorul crede că scrieți cod complet neașteptat:

Cod Note
String s = ""Friends" was nominated for an "Oscar"";
Această opțiune nu va funcționa!

După ce compilatorul întâlnește ghilimele duble în cod, tratează ceea ce urmează ca începutul unui șir literal. Următoarele ghilimele duble indică sfârșitul literalului șir.

Deci, cum scrieți ghilimele duble într-un literal?


2. Evadarea caracterelor

Există o cale. Se numește caractere care evadează . Doar scrieți ghilimelele în șirul de text. Și înainte de ghilimele, adăugați simbolul \( bară oblică inversă ).

Iată cum arată literalul șir atunci când este scris corect:

Cod Note
String s = "\"Friends\" was nominated for an \"Oscar\"";
Aceasta va funcționa!

Compilatorul va interpreta totul corect și nu va considera ghilimelele de după bară oblică inversă ca fiind ghilimele normale.

În plus, dacă scoateți acest șir pe ecran, ghilimele cu bare oblice inverse vor fi procesate corect, iar textul va fi afișat fără bare oblice inverse:"Friends" was nominated for an "Oscar"

Un alt punct important. Un ghilimele precedat de o bară oblică inversă reprezintă un singur caracter: pur și simplu folosim o notație elegantă care nu interferează cu capacitatea compilatorului de a recunoaște literalele șir în codul nostru. Puteți atribui ghilimele unei charvariabile:

Cod Note
char c = '\"';
\"este un personaj, nu doi
char c = '"';
Acest lucru este posibil și: un ghilimele duble în interiorul ghilimelelor simple

3. Situații frecvente care apar la evadarea personajelor

Situații comune care implică evadarea personajelor

Pe lângă ghilimele duble, există multe alte caractere pe care compilatorul le gestionează într-un mod special. De exemplu, o întrerupere de linie.

Cum adăugăm o întrerupere de linie la un literal? Există, de asemenea, o combinație specială pentru aceasta:

\n
Caracter de întrerupere de linie

Dacă trebuie să adăugați o întrerupere de linie la un literal șir, trebuie doar să adăugați câteva caractere: \n.

Exemplu:

Cod Ieșire de consolă
System.out.println("Best regards, \n Anonymous");
             
Best regards,
Anonymous

Există un total de 8 combinații speciale ca aceasta, care sunt numite și secvențe de evacuare . Aici sunt ei:

Cod Descriere
\t Inserați un caracter tabulator
\b Introduceți un caracter înapoi
\n Introduceți un caracter de linie nouă
\r Introduceți un caracter de întoarcere car
\f Inserați un caracter de feed de pagină
\' Introduceți un singur ghilimele
\" Introduceți ghilimele duble
\\ Introduceți o bară oblică inversă

Sunteți familiarizat cu două dintre ele, dar ce înseamnă celelalte 6?

\teste un caracter tabulator

Când acest text apare în text, este echivalent cu apăsarea Tabtastei în timpul tastării. Deplasează textul care îl urmează și face posibilă alinierea textului.

Exemplu:

Cod Ieșire de consolă
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

\bînseamnă „întoarce-te cu un caracter”

Această secvență într-un șir este echivalentă cu apăsarea Backspacetastei de pe tastatură. Îndepărtează caracterul care îl precede:

Cod Ieșire de consolă
System.out.println("Hello\b\b World");
Hell World!

\reste caracterul de întoarcere a căruciorului

Acest caracter mută cursorul la începutul liniei curente fără a modifica textul. Indiferent ce va fi afișat în continuare, va suprascrie șirul existent.

Exemplu:

Cod Ieșire de consolă
System.out.println("Greetings\r World!");
World!

\feste un caracter de feed de pagină

Acest simbol vine la noi din zilele primelor imprimante matriciale. Ieșirea acestei secvențe la o imprimantă ar face ca imprimanta să alimenteze pur și simplu foaia curentă, fără a imprima niciun text, până când începe o nouă pagină.

Acum l-am numi o întrerupere de pagină sau o pagină nouă .

\\este o bară oblică inversă

Totul este simplu aici. Dacă folosim o bară oblică inversă pentru a evada caracterele din textul nostru, atunci cum scriem un caracter oblică inversă în șir?

Este simplu: adăugați o bară oblică inversă textului - trebuie să scrieți două la rând.

Exemplu:

Cod Ieșire de consolă
System.out.println("c:\projects\my\first");
Compilatorul va țipa la tine pentru caractere necunoscute scăpate.
System.out.println("c:\\projects\\my\\first");
Așa se face bine!


4. Codificare Unicode

După cum știți deja, fiecare caracter afișat pe ecran corespunde unui anumit cod numeric. Un set standardizat de aceste coduri se numește codificare .

Pe vremuri, când computerele erau nou inventate, șapte biți (mai puțin de un octet) erau suficienți pentru a codifica fiecare caracter. Prima codificare conținea doar 128 de caractere. Această codificare a fost numită ASCII .

ASCII înseamnă American Standard Code for Information Interchange — un tabel american standard de coduri pentru caractere imprimabile și unele coduri speciale.

Este format din 33 de caractere de control neprintabile (care afectează modul în care textul și spațiile sunt procesate) și 95 de caractere imprimabile, inclusiv numere, litere latine mari și mici și mai multe semne de punctuație.

Codificare Unicode

Pe măsură ce computerele au crescut în popularitate, fiecare țară a început să-și lanseze propria codare. De obicei, au luat ASCII ca punct de plecare și au înlocuit caracterele ASCII rar folosite cu simboluri din alfabetele lor respective.

De-a lungul timpului, a apărut o idee: creați o singură codificare care conține toate caracterele fiecărei codificări din lume.

Codificare Unicode 1

Astfel, în 1993, a fost creată codificarea Unicode , iar limbajul Java a devenit primul limbaj de programare care a folosit această codificare ca standard pentru stocarea textului. Acum Unicode este standardul pentru întreaga industrie IT.

Deși Unicode în sine este standardul, are mai multe reprezentări sau formate de transformare Unicode (UTF): UTF-8, UTF-16 și UTF-32 etc.

Java folosește o versiune avansată de codificare Unicode — UTF-16: fiecare caracter este codificat pe 16 biți (2 octeți). Poate găzdui până la 65.536 de caractere!

Puteți găsi aproape fiecare caracter din fiecare alfabet din lume în această codificare. Desigur, nimeni nu a memorat totul. Nu poți ști totul, dar poți căuta totul pe google.

Pentru a scrie un caracter Unicode în programul dvs. folosind codul său, trebuie să scrieți \u+ codul în hexazecimal . De exemplu,\u00A9

Cod Ieșire de consolă
System.out.println("\u00A9 CodeGym");
© CodeGym


5. Unicode: punct de cod

„640 kilobytes ar trebui să fie suficienți pentru toată lumea! Sau nu”. (Citat atribuit lui Bill Gates)

Viața este dură și, în timp, codificarea UTF-16 a început să fie inadecvată. Se pare că există o mulțime de limbi asiatice și au o mulțime de glife. Și toate aceste glife pur și simplu nu pot fi înghesuite în 2 octeți.

Ce se poate face? Utilizați mai mulți octeți !

Dar tipul char are doar 2 octeți și schimbarea lui la 4 nu este atât de ușoară: în întreaga lume au fost scrise miliarde de linii de cod Java, care s-ar rupe dacă tipul char devine brusc de 4 octeți o mașină Java. Deci nu putem schimba tipul de caractere!

Există o altă abordare. Amintiți-vă cum scăpăm de personaje punând o bară oblică inversă în fața lor. Practic, am codificat un singur caracter folosind mai multe caractere.

Creatorii lui Java au decis să folosească aceeași abordare.

Unele caractere care apar vizual ca un singur caracter sunt codificate ca două chars într-un șir:

Cod Ieșire de consolă
System.out.println("\uD83D\uDD0A");
🔊

Acum, programul dvs. Java poate scoate chiar și emoji-uri pe consolă 😎