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 (\).
\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 „literau
+ 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.
GO TO FULL VERSION