JavaRush /Blog Java /Random-PL /Uciekające postacie

Uciekające postacie

Opublikowano w grupie Random-PL
Cześć! Z poprzednich wykładów zapoznaliśmy się już z ciągami znaków, które w Javie reprezentowane są przez klasę String. Jak zapewne pamiętasz, ciąg znaków to ciąg znaków. Symbolami mogą być dowolne litery, cyfry, znaki interpunkcyjne i tak dalej. Najważniejsze jest to, że podczas tworzenia ciągu cała sekwencja jest ujęta w cudzysłów:
public class Main {
   public static void main(String[] args) {
       String sasha = new String ("Меня зовут Саша, мне 20 лет!");
   }
}
Ale co się stanie, jeśli będziemy musieli utworzyć ciąg znaków zawierający również cudzysłowy? Na przykład chcemy opowiedzieć światu o naszej ulubionej książce:
public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - "Сумерки" Стефани Майер");
   }
}
Kompilator wydaje się być z czegoś niezadowolony! Jak myślisz, co może być przyczyną błędu i dlaczego wystąpił on szczególnie w przypadku cudzysłowów? Faktem jest, że kompilator postrzega cudzysłowy w ściśle określony sposób, a mianowicie zawija w nie ciąg znaków. I za każdym razem, gdy widzi znak ", spodziewa się, że ten sam znak podąży za nim, a pomiędzy nimi pojawi się tekst linii, którą on, kompilator, musi utworzyć. W naszym przypadku cudzysłowy wokół słowa „Zmierzch” znajdują się w innych cudzysłowach . A kiedy kompilator przychodzi do tego fragmentu tekstu, po prostu nie rozumie, czego od niego chce. Wygląda na to, że istnieje cytat, co oznacza, że ​​powinien utworzyć ciąg znaków. Ale on już to robi! To jest właśnie powód. Mówiąc najprościej, w tym momencie kompilator źle rozumie, czego od niego chce. "Kolejny cytat? Czy to jakiś błąd? Już tworzę ciąg znaków! A może powinienem utworzyć kolejny? Uhhh...:/" Musimy wyjaśnić kompilatorowi, kiedy cudzysłów jest dla niego poleceniem (" utwórz ciąg znaków!”), a gdy jest to prosty symbol („wyświetl słowo „Zmierzch” w cudzysłowie!”). Aby to osiągnąć, Java używa zmiany znaku . Odbywa się to za pomocą znaku specjalnego. Lubię to: \. W zwykłym życiu nazywa się to „ukośnikiem odwrotnym”, ale w Javie (w połączeniu ze znakiem, który ma zostać zmieniony) nazywa się to sekwencją ucieczki . Na przykład \"tutaj jest - sekwencja sterująca wyświetlaniem cytatów na ekranie. Po napotkaniu takiej konstrukcji w kodzie kompilator zrozumie, że jest to po prostu znak „cytatu”, który należy wyświetlić na ekranie. Spróbujmy zmienić nasz kod za pomocą książki:
public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - \"Сумерки\" Стефани Майер");
       System.out.println(myFavoriteBook);
   }
}
Uciekliśmy od dwóch „wewnętrznych” cudzysłowów za pomocą \. Spróbujmy uruchomić metodę main()... Dane wyjściowe konsoli:

Моя любимая книга - "Сумерки" Стефани Майер
Świetnie, kod działał dokładnie tak, jak trzeba! Cytaty nie są jedynym przypadkiem, w którym możemy potrzebować ucieczki przed znakiem. Chcieliśmy na przykład opowiedzieć komuś o naszej pracy:
public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
I znowu błąd! Czy domyślacie się już, jaki jest tego powód? Kompilator znowu nie rozumie, co robić. W końcu symbol \dla niego to nic innego jak sekwencja kontrolna ! Oczekuje, że po ukośniku powinien znajdować się jakiś znak, który będzie musiał zinterpretować w jakiś specjalny sposób (na przykład cudzysłów). Jednak tutaj \następują zwykłe litery. Zatem kompilator znów jest zdezorientowany. Co robić? Dokładnie tak samo jak ostatnim razem: po prostu dodaj \jeszcze jednego do naszego \!
public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
Zobaczmy, co z tego wyniknie: Dane wyjściowe konsoli:

Мои рабочие файлы лежат в папке D:\Work Projects\java
Super! Kompilator natychmiast ustalił, że \są to zwykłe znaki, które należy wyprowadzić na konsolę wraz z resztą. W Javie istnieje sporo sekwencji ucieczki. Oto ich pełna lista:
  • \t znak tabulacji.
  • \b powrót znaku w tekście o krok wstecz lub usunięcie jednego znaku w linii (backspace).
  • \n znak nowej linii.
  • \r znak powrotu karetki.
  • \f bieg strony.
  • \' znak pojedynczego cudzysłowu.
  • \" podwójny cudzysłów.
  • \\znak odwrotnego ukośnika (\).
Tak więc, jeśli kompilator napotka symbol w tekście \n, zrozumie, że nie jest to tylko symbol i litera, które należy wyprowadzić na konsolę, ale specjalne polecenie dla niego - „zrób podział wiersza!” Na przykład może się to nam przydać, jeśli chcemy wyprowadzić na konsolę fragment wiersza:
public class Main {
   public static void main(String[] args) {
       String borodino = new String ("Скажи-ка, дядя, \nВедь не даром \nМосква, спаленная пожаром, \nФранцузу отдана?");
       System.out.println(borodino);
   }
}
A oto co otrzymaliśmy: Dane wyjściowe konsoli:

Скажи-ка, дядя, 
Ведь не даром 
Москва, спаленная пожаром, 
Французу отдана?
Dokładnie to, czego potrzeba! Kompilator rozpoznał sekwencję ucieczki i wypisał fragment wersetu w 4 wierszach.

Unikod

Kolejnym ważnym tematem, o którym musisz wiedzieć w związku z ucieczką znaków, jest Unicode . Unicode to standard kodowania znaków, który obejmuje znaki z prawie wszystkich pisanych języków świata. Innymi słowy, jest to lista kodów specjalnych, w której znajduje się kod dla prawie dowolnego znaku z dowolnego języka! Naturalnie lista ta jest bardzo obszerna i nikt nie uczy się jej na pamięć :) Jeśli ciekawi Cię, skąd się wzięła i dlaczego była potrzebna, przeczytaj informacyjny artykuł na temat Habrahabr . Wszystkie kody znaków w Unicode to „litera u+ cyfra szesnastkowa”. Na przykład słynny symbol praw autorskich jest oznaczony kodem u00A9 . Jeśli więc chcesz użyć tego znaku podczas pracy z tekstem w Javie, możesz go pominąć w swoim tekście! Na przykład chcemy poinformować wszystkich, że prawa autorskie do tego wykładu posiada JavaRush:
public class Main {
   public static void main(String[] args) {
       System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
   }
}
Wyjście konsoli:

Лекция "Экранирование символов", © 2018 Javarush
Świetnie, wszystko się udało! Ale znaki specjalne to nie wszystko! Korzystając z Unicode i zmiany znaków, możesz kodować tekst napisany w różnych językach jednocześnie. A nawet w kilku różnych dialektach tego samego języka!
public class Main {
   public static void main(String[] args) {

       System.out.println("\u041c\u0430\u0301\u043e " +
               "\u0426\u0437\u044d\u0434\u0443\u0301\u043d " +
               "\u0028\u043a\u0438\u0442\u002e \u0442\u0440\u0430\u0434\u002e " +
               "\u6bdb\u6fa4\u6771\u002c \u0443\u043f\u0440\u002e " +
               "\u6bdb\u6cfd\u4e1c\u002c \u043f\u0438\u043d\u044c\u0438\u043d\u044c\u003a " +
               "\u004d\u00e1\u006f \u005a\u00e9\u0064\u014d\u006e\u0067\u0029 " +
               "\u2014 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 " +
               "\u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 " +
               "\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 " +
               "\u0434\u0435\u044f\u0442\u0435\u043b\u044c \u0058\u0058 \u0432\u0435\u043a\u0430\u002c " +
               "\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u043a " +
               "\u043c\u0430\u043e\u0438\u0437\u043c\u0430\u002e");
   }
}
Wyjście konsoli:

Ма́о Цзэду́н (кит. трад. 毛澤東, упр. 毛泽东, пиньинь: Máo Zédōng) — китайский государственный и политический деятель XX века, главный теоретик маоизма.
W tym przykładzie, znając kody znaków, napisaliśmy ciąg składający się z cyrylicy i trzech (!) różnych rodzajów pisma chińskich znaków - klasycznego, uproszczonego i łacińskiego (pinyin). To w zasadzie tyle! Teraz wiesz już wystarczająco dużo o ucieczce postaci, aby wykorzystać to narzędzie w swojej pracy :) Jeśli nie wszystko jest do końca jasne, radzę przeczytać ten artykuł : będzie to dobry dodatek.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION