CodeGym/Blog Java/Poland/Znaki eskejpowania w Javie
Autor
Vasyl Malik
Senior Java Developer at 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 alex = new String ("My name is Alex. I'm 20!");
   }
}
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 ("My favorite book is "Twilight" by 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 ("My favorite book is \"Twilight\" by 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:
My favorite book is "Twilight" by 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 ("My work files are in 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 ("My work files are in D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
Zobaczmy, co otrzymamy: Wyświetlone zostanie:
My work files are in 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 ("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);
   }
}
Oto, co otrzymamy: Wyświetlone zostanie:
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...
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("\"Escaping characters\", \u00A9 2019 CodeGym");
   }
}
Wyświetlone zostanie:
"Escaping characters", © 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
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy