Fragment wykładu z mentorem w ramach kursu Codegym University. Zapisz się na pełny kurs.


"Witaj, Amigo. Dawno, dawno temu nauczyłeś się, że aby napisać ciąg znaków w kodzie, musisz ująć je w cudzysłowy."

„Tak, a to daje nam literał łańcuchowy . Nie tak dawno się o tym dowiedziałem”.

„W naszym zawodzie to było dawno temu. Ale teraz nie o to chodzi. Zamiast tego powiedz mi, co mam zrobić, jeśli potrzebujemy cudzysłowów w literałach łańcuchowych?”

"Hmm... Ciąg znaków zawierający cudzysłowy — co może być prostszego. Na pewno jest jakiś sposób..."

„Tak. Powiedzmy, że chcemy wyświetlić tekst "Friends" was nominated for an "Oscar". Jak byśmy to zrobili?”

„Szczerze mówiąc, nie mam pojęcia. Nic nie przychodzi mi do głowy”.

„Nie będziesz w stanie dojść do rozwiązania za pomocą logiki. Pozwól, że pokażę ci, co robić.

Kod Notatki
String s = ""Friends" was nominated for an "Oscar"";
Ta opcja nie zadziała!"

„Ta opcja nie zadziała, ponieważ kompilator interpretuje to jako zupełnie inny kod:

Kod Notatki
String s = ""Friends" was nominated for an "Oscar"";
Ta opcja nie zadziała!"

„Kiedy kompilator napotka podwójne cudzysłowy w kodzie, traktuje to, co następuje, jako początek literału ciągu. Następny podwójny cudzysłów wskazuje koniec literału ciągu”.

„Więc jak pisać podwójne cudzysłowy wewnątrz dosłownego?”

„Jest na to sposób. Nazywa się to uciekaniem znaków . Wystarczy wpisać znaki cudzysłowu w ciągu tekstu. A przed cudzysłowami dodać symbol \ ( ukośnik odwrotny ).

„Tak wygląda literał łańcuchowy, gdy jest napisany poprawnie:

Kod Notatki
String s = "\"Friends\" was nominated for an \"Oscar\"";
To zadziała!

„Kompilator zinterpretuje wszystko poprawnie i nie uzna cudzysłowu po odwrotnym ukośniku za normalny cudzysłów.

„Co więcej, jeśli wyświetlisz ten ciąg znaków na ekranie, cudzysłowy z ukośnikami odwrotnymi zostaną przetworzone poprawnie, a tekst zostanie wyświetlony bez ukośników odwrotnych:"Friends" was nominated for an "Oscar"

„Cóż, nie powiem, że to jest super wygodne…”

„Ale co możesz zrobić, takie są zasady. Kolejna ważna kwestia. Cudzysłów poprzedzony odwrotnym ukośnikiem reprezentuje pojedynczy znak: po prostu używamy zręcznej notacji, która nie koliduje ze zdolnością kompilatora do rozpoznawania literałów łańcuchowych w naszym kod Możesz przypisać cudzysłowy do charzmiennej:

Kod Notatki
char c = '\"';
\"to jeden znak, a nie dwa
char c = '"';
Jest to również możliwe: podwójny cudzysłów w pojedynczych cudzysłowach

Typowe sytuacje występujące podczas ucieczki znaków

„Oprócz podwójnych cudzysłowów istnieje wiele innych znaków, które kompilator obsługuje w specjalny sposób. Na przykład koniec wiersza.

„Jak dodać podział wiersza do literału? Istnieje również specjalna kombinacja:

\n
Znak końca linii

„Jeśli chcesz dodać podział wiersza do literału łańcuchowego, po prostu dodaj kilka znaków” \n.

Przykład:

Kod Wyjście konsoli
System.out.println("Best regards, \n Anonymous");
             
Best regards,
Anonymous

„Istnieje w sumie 8 specjalnych kombinacji takich jak ta, które są również nazywane sekwencjami ucieczki . Oto one:

Kod Opis
\t Wstaw znak tabulacji
\b Wstaw znak backspace
\n Wstaw znak nowej linii
\r Wstaw znak powrotu karetki
\f Wstaw znak kanału strony
\' Wstaw pojedynczy cudzysłów
\" Wstaw podwójny cudzysłów
\\ Wstaw ukośnik odwrotny

„Dwóch z nich już mi pokazałeś. Co oznacza pozostałe 6?”

„Już wszystko wyjaśnię.

\tjest znakiem tabulacji

Pojawienie się tego tekstu w tekście jest równoznaczne z naciśnięciem klawisza Tabpodczas pisania. Przesuwa tekst, który następuje po nim i umożliwia wyrównanie tekstu.

Przykład:

Kod Wyjście konsoli
System.out.println("0\t1\t2\t3");
System.out.println("0\t10\t20\t30");
System.out.println("0\t100\t200\t300");
0       1        2        3
0       10       20       30
0       100      200      300

\boznacza „cofnij się o jeden znak”

Ta sekwencja w łańcuchu odpowiada naciśnięciu Backspaceklawisza na klawiaturze. Usuwa poprzedzający go znak:

Kod Wyjście konsoli
System.out.println("Hello\b\b World");
Hel World

\rjest znakiem powrotu karetki

Ten znak przesuwa kursor na początek bieżącej linii bez zmiany tekstu (zależy od wersji JDK). Cokolwiek zostanie wyświetlone jako następne, nadpisze istniejący ciąg.

Przykład:

Kod Wyjście konsoli
System.out.println("Greetings\r World!");
World!ngs

\fjest znakiem kanału informacyjnego strony

Symbol ten pochodzi z czasów pierwszych drukarek igłowych. Wyprowadzenie tej sekwencji do drukarki spowodowałoby, że drukarka po prostu podała bieżący arkusz, bez drukowania żadnego tekstu, aż do rozpoczęcia nowej strony.

Teraz nazwalibyśmy to podziałem strony lub nową stroną .

\\jest ukośnikiem odwrotnym

Tutaj wszystko jest proste. Jeśli użyjemy ukośnika odwrotnego do zmiany znaczenia znaków w naszym tekście, to w jaki sposób zapiszemy sam znak odwrotnego ukośnika w łańcuchu?

To proste: dodaj ukośnik odwrotny do tekstu — musisz napisać dwa z rzędu.

Przykład:

Kod Wyjście konsoli
System.out.println("c:\projects\my\first");
Kompilator będzie krzyczeć na ciebie za nieznane znaki ucieczki.
System.out.println("c:\\projects\\my\\first");
Tak to się robi dobrze!

„Używanie podwójnych ukośników ma sens. Ale nie byłem w stanie od razu zapamiętać wszystkiego innego. Muszę polegać na twoich wskazówkach”.

„Stopniowo będziesz sobie przypominać, czego potrzebujesz. Nie martw się. A do wszystkiego innego służy Google.

Kodowanie Unicode

„Wiesz już, że każdy znak wyświetlany na ekranie odpowiada określonemu kodowi numerycznemu. Ustandaryzowany zestaw tych kodów nazywa się kodowaniem .

„Dawno, dawno temu, kiedy komputery były nowo wynalezione, siedem bitów (mniej niż jeden bajt) wystarczało do zakodowania każdego znaku. Pierwsze kodowanie zawierało tylko 128 znaków. To kodowanie nazwano ASCII .

– To dziwne imię.

„Nie ma w tym nic dziwnego. To skrót. ASCII to skrót od American Standard Code for Information Interchange — standardowa amerykańska tabela kodów dla znaków drukowalnych i niektórych kodów specjalnych”.

„Składa się z 33 niedrukowalnych znaków kontrolnych (które wpływają na sposób przetwarzania tekstu i spacji) oraz 95 znaków drukowalnych, w tym cyfr, wielkich i małych liter łacińskich oraz kilku znaków interpunkcyjnych.

„W miarę jak komputery zyskiwały na popularności, każdy kraj zaczął wypuszczać własne kodowanie. Zwykle za punkt wyjścia przyjęli ASCII i zastąpili rzadko używane znaki ASCII symbolami z ich odpowiednich alfabetów.

„Z biegiem czasu pojawił się pomysł: stworzyć jedno kodowanie, które zawiera wszystkie znaki każdego kodowania na świecie.

Kodowanie Unicode

„W ten sposób w 1993 roku powstało kodowanie Unicode , a język Java stał się pierwszym językiem programowania, który wykorzystał to kodowanie jako standard przechowywania tekstu. Obecnie Unicode jest standardem dla całej branży IT.

„Chociaż sam Unicode jest standardem, ma kilka reprezentacji lub formatów transformacji Unicode (UTF): UTF-8, UTF-16 i UTF-32 itd.

„Java używa zaawansowanej wersji kodowania Unicode — UTF-16: każdy znak jest zakodowany w 16 bitach (2 bajty). Może pomieścić do 65 536 znaków! W tym kodowaniu można znaleźć prawie każdy znak ze wszystkich alfabetów na świecie. "

– Mam nadzieję, że nie muszę znać tego na pamięć?

– Jeśli chcesz, to idź!

„Dobrze, dobrze. Zastosuję tę zasadę: nie możesz wiedzieć wszystkiego, ale możesz wszystko wygooglować”.

„Przyjęcie racjonalnego podejścia jest wszystkim. Tak więc, aby napisać znak Unicode w swoim programie przy użyciu jego kodu, musisz napisać \u+ kod w systemie szesnastkowym . Na przykład:\u00A9

Kod Wyjście konsoli
System.out.println("\u00A9 CodeGym");
© CodeGym

Unicode: punkt kodu

„640 kilobajtów powinno wystarczyć dla wszystkich! Albo nie”. Bill Gates kiedyś tak powiedział. Albo nie. Przynajmniej ten cytat jest przypisywany jemu”.

„Haha. 640 kilobajtów to nawet za mało, aby załadować mózg robota sprzątającego”.

„Życie jest ciężkie iz biegiem czasu kodowanie UTF-16 zaczęło być niewystarczające. Okazuje się, że języków azjatyckich jest dużo i mają dużo glifów. A tych wszystkich glifów po prostu nie da się zmieścić w 2 bajtach ”.

"Więc co robimy?"

„Użyj więcej bajtów ! Ale typ char ma tylko 2 bajty, a zmiana go na 4 nie jest taka łatwa: na całym świecie napisano miliardy linii kodu Java, który by się zepsuł, gdyby typ char nagle stał się 4 bajtami Java machine. Więc nie możemy zmienić typu znaku!

„Istnieje inne podejście. Pamiętaj, jak unikamy znaków, umieszczając przed nimi odwrotny ukośnik. Zasadniczo zakodowaliśmy pojedynczy znak za pomocą wielu znaków. Twórcy Javy zdecydowali się zastosować to samo podejście.

„Niektóre znaki, które wizualnie wyglądają jak pojedynczy znak, są zakodowane jako dwie charlitery w łańcuchu:

Kod Wyjście konsoli
System.out.println("\uD83D\uDD0A");
🔊

„Teraz Twój program Java może nawet wyświetlać emotikony na konsoli 😎”

„Na pewno wykorzystam to do zabawy!”