Coś poszło nie tak! Artykuł ten został napisany jako zadanie testowe na stanowisko w zespole JavaRush. I został napisany jako pełnoprawny wykład. Dzięki temu gwarantuję Ci jakość i ilość przydatnej wiedzy zgromadzonej w tym poście. Oprócz informacji praktycznych i teoretycznych w artykule znajdują się ciekawostki, o których być może nawet nie miałeś pojęcia!
Witaj świecie!
Ucieczka postaci jest bardzo ciekawym i niezbędnym rozwiązaniem technicznym. Potrzeba ucieczki przed znakami odegrała ważną rolę w historii całej branży programistycznej. W tym artykule porozmawiamy o tym, czym jest ucieczka znaków, dlaczego istnieje potrzeba ucieczki przed nimi i jak zaimplementowano ucieczkę znaków w Javie. W artykule podane zostaną przykłady i ciekawostki związane z tematem ucieczki postaci. Miłego czytania! Wszystkie informacje w systemie komputerowym są reprezentowane w formie tekstu, który na niższym poziomie jest reprezentowany przez bajty. Pisząc list lub wiadomość, wpisujemy tekst, który będzie dla danej osoby zrozumiały. Kiedy piszemy kod w IDE, wpisujemy tekst, który kompilator może przeanalizować. W Javie tekst może być reprezentowany jako typ,
String
którego dane są reprezentowane przez znaki kontrolne – pary cudzysłowów.
String str = "Hello World!";
Z tekstem „Hello World!” nie ma żadnych problemów, ale co, jeśli ten sam tekst wymaga podkreślenia w mowie bezpośredniej? Korzystając z zasad gramatyki, staje się jasne, że tekst „Hello World!”, oprócz znaków kontrolnych z typu
String
, musi zostać umieszczony w bezpośrednim cudzysłowie mowy.
String str = "Java said, "Hello World!"";
Ta opcja nie będzie działać, ponieważ kompilator po prostu nie zrozumie, w którym momencie kończy się inicjalizacja zmiennej
str
. Aby rozwiązać ten i podobne problemy, wymyślono
znaki ucieczki , czyli zmianę
znaków kontrolnych na tak zwane sekwencje kontrolne, zwane także
sekwencjami ucieczki . Poniżej znajduje się lista prawidłowych sekwencji ucieczki Java do użycia w ciągach znaków.
\t
— Znak tabulatora (w Javie – odpowiednik czterech spacji);
\b
— Znak powrotu w tekście o krok wstecz lub usunięcie jednego znaku w linii (backspace);
\n
— Nowy symbol linii;
\r
— symbol powrotu przewozu;
\f
— Przejdź do początku następnej strony;
\'
— Znak pojedynczego cudzysłowu;
\"
— Znak podwójnego cudzysłowu;
\\
— Znak ukośnika odwrotnego (
\
). Teraz podkreślmy bezpośrednią mowę w naszej frazie, aby kompilator mógł łatwo przeanalizować to, co jest napisane.
String str = "Java said, \"Hello World!\"";
Zatem napisany tekst jest zrozumiały zarówno dla kompilatora, jak i osoby, jeśli zawartość zmiennej
str
zostanie wyświetlona na ekranie. Dowiedzieliśmy się, czym jest ucieczka postaci i dlaczego jest potrzebna. I nawet uniknęli znaku podwójnego cudzysłowu! Przejdźmy do analizy pozostałych sekwencji ucieczki.
Znak tabulacji w wierszu jest wskazywany przez sekwencję ucieczki
\t
i jest analogiczny do czterech spacji. Jeśli jednak długość ciągu znaków składającego się z czterech spacji jest równa długości czterech znaków, to długość ciągu znaków ze znakiem tabulacji będzie równa jeden. Znak tabulacji jest często używany do konstruowania tabel lub
pseudograficznych elementów interfejsu, ponieważ... Jest to wygodniejsze niż pisanie czterech spacji. Poniżej znajduje się przykład interfejsu pseudograficznego.
Spośród wszystkich sekwencji ucieczki symbol jest
\b
chyba najciekawszy, ponieważ pozwala nam usunąć ostatni znak z linii wyjściowej, podobnie jak gdybyśmy go usunęli, naciskając klawisz
Backspace .
System.out.print("2 + 2 = 5");
System.out.print("\b");
System.out.print("4");
Symbole
\n
mają
\r
wspólną historię – przyjrzyjmy się im razem. Być może spotkałeś się już wcześniej ze znakiem podziału wiersza
\n
. Na przykład, jeśli metoda
println()
wyprowadza informację w taki sposób, że następny wynik będzie w nowej linii, to metoda
print()
nie wykonuje podziału wiersza po wyniku, ale jeśli dodasz znak na końcu wyniku
\n
, wówczas nastąpi podział wiersza będzie wystawiany.
System.out.print("Następne wyjście będzie w nowej linii\n");
System.out.println(„Następne wyjście będzie w nowej linii”);
Znak powrotu karetki
\r
pozwala nam cofnąć kursor na początek linii wyjściowej i wyświetlić nowe informacje tak, jakby nic wcześniej nie było w tej linii.
System.out.print(„Tekst do przepisania”.);
System.out.print('\r');
System.out.print(„Nowy tekst”.);
Tak naprawdę powrót karetki sięga czasów, gdy tekst drukowano na maszynach do pisania. Aby wykonać przesunięcie wiersza, należało przesunąć karetkę i opuścić dźwignię (część mechanizmu maszyny do pisania), po czym nastąpi przesunięcie wiersza. Jeżeli dźwignia nie została opuszczona, można było kontynuować drukowanie w tej samej linii. To właśnie obserwujemy, wyświetlając symbol
\r
. W związku z tym, gdy programista chciał dokonać podziału wiersza, z przyzwyczajenia wykonywał ciąg znaków na końcu wyniku
\r\n
. Gdy era maszyn do pisania dobiegła końca, pokolenie programistów nadal korzystało z tej sekwencji, chociaż sami nigdy nie pracowali przy maszynie do pisania. Często zapominali, w jakiej kolejności musieli wykonać daną sekwencję -
\r\n
lub
\n\r
. Wtedy z pomocą przyszło im słowo testowe
return
, w którym wyraźnie widoczna była kolejność wyświetlania tych symboli. Jednak później, tworząc oprogramowanie dla pierwszych wersji systemu Windows, po MS-DOS, programiści zmuszeni byli stosować sekwencję
\r\n
. Teraz nie musisz się tym martwić i do przerwania linii użyj wyłącznie znaku
\n
.
Cofnijmy się jeszcze raz w czasie, w okolice lat 80-tych. To właśnie wtedy popularny stał się symbol oznaczający przejście
\f
do początku następnej strony. W tamtych czasach istniały drukarki wielkoliniowe, do pracy z którymi trzeba było napisać kod programu zawierający co i jak drukarka ma drukować. Aby wskazać, że tekst należy rozpocząć od nowej strony, zastosowano symbol
\f
. W naszych czasach ten symbol już dawno stracił na znaczeniu i jest mało prawdopodobne, że kiedykolwiek go spotkasz. Wymiary drukarki liniowej robią wrażenie.
Z symbolami
\’
i
\\
wszystko jest dokładnie tak samo jak z ucieczką od podwójnego cudzysłowu, przykład był na początku artykułu. Będziesz musiał na przykład uciec od pojedynczego cudzysłowu, aby zainicjować typ znaku pojedynczym cudzysłowem.
char ch = '\'';
Ucieknij od znaku ukośnika odwrotnego, aby wskazać, że następujący znak nie będzie częścią sekwencji ucieczki.
System.out.println("\\n - sekwencja ucieczki końca wiersza");
W praktyce często podczas pracy ze ścieżkami trzeba unikać ukośników odwrotnych:
System.out.println("It's Java string: \"C:\\Program Files\\Java\\jdk1.7.0\\bin\"");
Podkreśliłem, że te sekwencje specjalne są używane w ciągach znaków (literałach łańcuchowych), ponieważ reszta służy do opisu wyrażeń regularnych klas
Pattern
i nie ma związku z tematem tego artykułu.
Tutaj możesz zobaczyć listę wszystkich sekwencji ucieczki dla tej klasy
Pattern
. Warto jednak zaznaczyć, że wyrażeń regularnych w takiej formie, w jakiej obecnie istnieją, nie można sobie wyobrazić bez użycia sekwencji ucieczki, nie tylko w Javie, ale także w innych popularnych językach programowania, np. PHP. W Javie zmiana znaczenia znaków jest również używana przy formatowaniu ciągów. Na przykład, określając format ciągu do wyświetlania symbolu procentu, należy zduplikować symbol procentu -
%%
, w przeciwnym razie pojawi się błąd, a IDE poprosi o dodanie procentu.
System.out.printf(„Procent tłuszczu w mleku: %d%%”, 10);
Na tym kończy się artykuł. Mam nadzieję, że nauczyłeś się wiele o ucieczce postaci i tym, jak zastosować ją w praktyce. Ucieczka znaków jest nieodłącznym elementem wielu języków programowania. W Javie, podobnie jak w innych językach podobnych do C, technologia ta jest zaimplementowana niemal identycznie. Dlatego wiedza zdobyta w tym artykule może przydać się nie tylko w Javie. Dziękuję za uwagę i życzę powodzenia w nauce!
GO TO FULL VERSION