Vasyl Malik
Senior Java Developer w CodeGym

Znaki eskejpowania w Javie

Opublikowano w grupie Poland
Cześć! W poprzednich lekcjach zapoznaliśmy się już z ciągami tekstowymi, które w Javie są reprezentowane przez klasę String. Znaki eskejpowania w Javie - 1Jak zapewne pamiętasz, string to sekwencja znaków. Znaki te mogą być dowolnymi literami, cyframi, znakami interpunkcyjnymi i tak dalej. Najważniejsze przy tworzeniu stringu jest to, że cała sekwencja musi być ujęta w cudzysłów:

public class Main {
   public static void main(String[] args) {
       String patryk = new String ("Nazywam się Patryk. Mam 20 lat!");
   }
}
Ale co zrobimy, jeśli musimy utworzyć ciąg, który ma zawierać znaki cudzysłowu? Załóżmy, że chcemy opowiedzieć światu o Twojej ulubionej książce:

public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("Moja ulubiona książka to "Zmierzch" autorstwa Stephanie Meyer");
   }
}
Wygląda na to, że kompilator jest z czegoś niezadowolony! Jak myślisz, na czym polega problem? I co to ma wspólnego ze znakami cudzysłowu? Tak naprawdę, to wszystko jest bardzo proste. Kompilator interpretuje cudzysłowy w bardzo specyficzny sposób, to znaczy oczekuje, że określają one końce ciągów tekstowych. I za każdym razem, gdy kompilator widzi ", oczekuje że po cudzysłowie pojawi się kolejny cudzysłów, a treść między nimi jest ciągiem, z którego kompilator ma utworzyć string. W naszym przypadku cudzysłów wokół słowa "Zmierzch" jest umieszczony wewnątrz innych cudzysłowów. Kiedy kompilator dociera do tego fragmentu tekstu, po prostu nie rozumie czego się od niego oczekuje. Znak cudzysłowu sugeruje, że należy utworzyć string. Ale kompilator już to robi! Oto dlaczego: po prostu kompilator nie rozumie czego od niego oczekujemy. "Kolejny cudzysłów? Czy to jakiś błąd? Tworzę już string! A może mam utworzyć kolejny? Grrr!...:/" Musimy poinformować kompilator, kiedy cudzysłów jest poleceniem ("utwórz string!"), a kiedy jest po prostu znakiem ("wyświetl słowo "Zmierzch" razem z cudzysłowami!"). Aby to zrobić, Java używa eskejpowania znaków. Służy do tego specjalny symbol: \. Ten symbol nazywamy "backslash" (odwrotny ukośnik). W Javie backslash w połączeniu ze znakiem, który ma być "eskejpowany" (lub "modyfikowany") nazywamy sekwencją ucieczki lub unikową. Na przykład \" to sekwencja ucieczki do wyświetlania cudzysłowów na ekranie. Po napotkaniu tej konstrukcji w kodzie kompilator zrozumie, że jest to tylko znak cudzysłowu, który powinien być wyświetlony. Spróbujmy zmienić nasz kod o książce:

public static void main(String[] args) {
       String myFavoriteBook = new String ("Moja ulubiona książka to \"Zmierzch\" autorstwa Stephanie Meyer");
       System.out.println(myFavoriteBook);
   }
}
Użyliśmy \, aby eskejpować nasze dwa "wewnętrzne" znaki cudzysłowu. Spróbujmy uruchomić metodę main()... Wyświetlone zostanie:
Moja ulubiona książka to "Zmierzch" autorstwa Stephanie Meyer
Doskonale! Kod zadziałał dokładnie tak, jak tego chcieliśmy! Cudzysłowy to nie jedyne znaki, które mogą wymagać eskejpowania. Załóżmy, że chcemy opowiedzieć komuś o naszej pracy:

public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("Moje pliki robocze znajdują się w D \Work Projects\java");
       System.out.println(workFiles);
   }
}
Kolejny błąd! Wiesz dlaczego? Jeszcze raz, kompilator nie wie co zrobić. W końcu kompilator nie wie, że \ może być czymś innym niż sekwencja ucieczki! Oczekuje, że po odwrotnym ukośniku pojawi się znak, który należy interpretować w specjalny sposób (np. cudzysłów). Ale w tym przypadku po \ pojawiają się zwykłe litery. Więc kompilator znowu jest zdezorientowany. Co powinniśmy zrobić? Dokładnie to samo co wcześniej: dodać kolejny \ przed naszym \!

public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("Moje pliki robocze znajdują się w D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
Zobaczmy, co otrzymamy: Wyświetlone zostanie:
Moje pliki robocze znajdują się w D:\Work Projects\java
Super! Kompilator natychmiast zdecydował, że \ to zwykłe znaki, które należy wyświetlić razem z resztą tekstu. Java ma sporo sekwencji unikowych. Oto pełna lista:
  • \t — tabulator.
  • \b — backspace (krok wstecz w tekście lub usunięcie pojedynczego znaku).
  • \n — nowa linia.
  • \r — powrót karetki.
  • \f — wysunięcie papieru.
  • \' — pojedynczy cudzysłów.
  • \" — podwójny cudzysłów.
  • \\ — odwrotny ukośnik.
Zatem, jeżeli kompilator napotka w tekście \n, zrozumie, że nie jest to tylko symbol i litera do wyświetlenia w konsoli, ale specjalne polecenie "przejdź do nowej linii!". Może to być przydatne, jeżeli chcemy wyświetlić na przykład fragment wiersza:

public class Main {
   public static void main(String[] args) {
       String byron = new String ("Idzie w Piękności, jak noc, która kroczy \nW cichym gwiazd gronie przez bezchmurne kraje;\nCo cień i światło w sobie kras jednoczy,\nTo w jej obliczu i w jej oczach taje...");
       System.out.println(byron);
   }
}
Oto, co otrzymamy: Wyświetlone zostanie:
Idzie w Piękności, jak noc, która kroczy W cichym gwiazd gronie przez bezchmurne kraje; Co cień i światło w sobie kras jednoczy, To w jej obliczu i w jej oczach taje...
Tak jak chcieliśmy! Kompilator rozpoznał sekwencje ucieczki i wyświetlił fragment wiersza w 4 liniach.

Eskejpowanie znaków Unicode

Kolejny ważny temat związany ze znakiem eskejpowania to Unicode. Unicode to standardowe kodowanie znaków, które obejmuje symbole prawie każdego języka pisanego na świecie. Innymi słowy, jest to lista specjalnych kodów, które reprezentują prawie każdy znak w dowolnym języku! Oczywiście jest to bardzo długa lista i nikt nie uczy się jej na pamięć :) Jeśli chcesz wiedzieć skąd się wzięła i dlaczego jest potrzebna, przeczytaj ten artykuł. Wszystkie kody znaków Unicode mają postać "u+<cyfra szesnastkowa>". Na przykład dobrze znany symbol praw autorskich to u00A9. Zatem, jeżeli chcesz użyć tego znaku pracując z tekstem w Javie, możesz eskejpować go w swoim tekście! Chcemy na przykład poinformować wszystkich, że CodeGym posiada prawa autorskie do tej lekcji:

public class Main {
   public static void main(String[] args) {
       System.out.println("\"Eskejpowanie znaków\", \u00A9 2019 CodeGym");
   }
}
Wyświetlone zostanie:
"Eskejpowanie znaków", © 2019 CodeGym
Świetnie, wszystko się udało! Ale nie chodzi tylko o symbole specjalne. Możesz użyć Unicode i znaków eskejpowania, aby zakodować tekst napisany jednocześnie w różnych językach. A nawet tekst zapisany w różnych dialektach tego samego języka!

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");
   }
}
Wyświetlone zostanie:
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.
W tym przykładzie użyliśmy kodów znaków, aby zbudować ciąg tekstowy składający się tekstu angielskiego i trzech(!) różnych typów chińskich znaków — tradycyjnych, uproszczonych i łacińskich (Pinyin). I to wszystko podsumowuje! Znaki eskejpowania w Javie - 2Teraz wiesz już wystarczająco dużo o znakach eskejpowania, aby użyć tego wspaniałego narzędzia w swojej pracy :)
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION