1. Podstawowe znaki specjalne i escapowanie
W programowaniu łańcuchy składają się nie tylko z liter, ale i ze znaków specjalnych: cudzysłowów, znaków nowej linii, tabulacji, a czasem nawet sekwencji takich jak \n i \t. Ale jeśli zechcesz napisać w łańcuchu Cześć, "user"!, kompilator od razu zapyta: „Czy cudzysłowy wewnątrz łańcucha — to błąd?”. Tu właśnie potrzebny jest mechanizm escapowania.
W Javie escapowanie to sposób nadania „szczególnego znaczenia” niektórym znakom wewnątrz łańcucha. Służy do tego ukośnik wsteczny \ (ang. „backslash”).
Klasyczne sekwencje specjalne:
| Sekwencja | Opis | Demonstracja |
|---|---|---|
|
Nowa linia | Naciśnięcie Enter |
|
Tabulacja | Tab |
|
Dosłownie „backslash” | |
|
Cudzysłów wewnątrz łańcucha | |
|
Apostrof (rzadko potrzebny w łańcuchach) | |
|
Powrót karetki (stary styl nowej linii, rzadko używany) | |
|
Znak null | (Niewidoczny) |
|
Backspace (usuwa poprzedni znak — w konsoli nie zawsze działa) |
Jak to działa
Napiszmy kilka łańcuchów z escapowanymi znakami, aby zobaczyć je w działaniu.
System.out.println("Cześć, \"Użytkownik\"!");
// Wyjście: Cześć, "Użytkownik"!
System.out.println("C:\\Program Files\\MyApp");
// Wyjście: C:\Program Files\MyApp
System.out.println("Linia 1\nLinia 2");
// Wyjście:
// Linia 1
// Linia 2
System.out.println("Ja\tkocham\ttabulację!");
// Wyjście:
// Ja kocham tabulację!
I tak, za pomocą jednego prostego znaku (\), możesz „przemycić” do łańcucha niemal każdy znak specjalny, nie wywołując paniki u kompilatora ani u kolegów z zespołu.
2. Wielowierszowe łańcuchy i podziały wiersza
Bardzo często trzeba napisać wielowierszową wiadomość albo ASCII-art. Najprostszym sposobem jest użycie \n w zwykłym łańcuchu.
System.out.println("Pierwsza linia\nDruga linia\nTrzecia linia");
Nie zawsze jest to jednak wygodne, dlatego w Javie pojawiły się bloki tekstowe (Text Blocks). Zaczynają się od potrójnych cudzysłowów """ i pozwalają pisać wielowierszowy tekst bez escapowania, zachowując formatowanie — idealne dla JSON, SQL i HTML.
// Wielowierszowy literał (Text Block)
String json = """
{
"name": "Alice",
"age": 30,
"skills": ["Java", "SQL", "Cloud"]
}
""";
System.out.println(json);
"""
Dzięki blokom tekstowym można też łatwo tworzyć wielowierszowy tekst zawierający cudzysłowy bez ich dublowania.
3. Unicode — jak w Javie przechowywane są dowolne symbole świata
We współczesnym świecie pracujemy nie tylko z łaciną, ale i z cyrylicą, ideogramami, symbolami matematycznymi, a nawet emoji. Wszystko to jest możliwe dzięki systemowi kodowania znaków — Unicode.
Co to jest Unicode?
Unicode to międzynarodowy standard, który przypisuje unikalny numer (code point) każdemu znakowi, niezależnie od języka i platformy. Dzięki temu możesz łatwo używać w Javie jednocześnie tekstu cyrylickiego, angielskiego, chińskich znaków, a nawet rzadkich znaków specjalnych.
Przykład łańcucha w różnych językach:
System.out.println("Hello, świecie! 你好! مرحبا!");
Znaki Unicode w łańcuchach
Możesz bezpośrednio pisać dowolne znaki wspierane przez Twoje kodowanie lub używać sekwencji escape w postaci \uXXXX, gdzie XXXX to 4‑cyfrowy szesnastkowy kod znaku.
System.out.println("Symbol: \u263A"); // Wypisze 😊
Dla znaków o kodzie większym niż 65535 (np. wiele emoji) używa się par surogatowych (UTF-16):
// Znak 😊 (kod 1F60A) jest reprezentowany przez dwa char
System.out.println("Emoji: \uD83D\uDE0A"); // Wypisze 😊
Co to Ci daje?
- Możesz przechowywać i przetwarzać dowolny tekst.
- Nie bój się mieszać języków i używać niestandardowych znaków — Java wspiera Unicode „z pudełka”.
- Szczególnie ważne przy pracy z międzynarodowymi użytkownikami i niestandardowymi alfabetami.
4. Emoji i znaki specjalne w łańcuchach
Współczesne łańcuchy to nie tylko litery, ale i emoji! Na przykład chcesz wysłać użytkownikowi wesołą wiadomość z „uśmieszkiem”.
Jak dodać emoji do łańcucha?
Wstaw emoji bezpośrednio do łańcucha:
System.out.println("Cześć! 😊");
Użyj kodów Unicode: dla większości emoji można używać par surogatowych.
System.out.println("Oto kotek: \uD83D\uDC31"); // 🐱
Emoji mogą zajmować dwa znaki w łańcuchu (ze względu na UTF-16). Dlatego przy niektórych operacjach (np. pobranie długości) mogą pojawić się niespodzianki:
String s = "😊";
System.out.println(s.length()); // Wypisze 2, a nie 1!
To dlatego, że jeden punkt kodowy Unicode jest kodowany jako dwa znaki char w Javie. Aby poprawnie pracować ze znakami, używaj punktów kodowych (code points) i odpowiednich metod zamiast prostego length().
5. Pułapki i częste błędy
Błąd nr 1: Nieprawidłowe użycie cudzysłowów wewnątrz łańcucha. Jeśli nie escapujesz wewnętrznych cudzysłowów, kompilator „myśli”, że łańcuch się skończył.
System.out.println("On powiedział: "Cześć!""); // Błąd!
Poprawnie:
System.out.println("On powiedział: \"Cześć!\"");
Błąd nr 2: Pojedynczy backslash w ścieżce. W Javie \ służy do sekwencji specjalnych (\n, \t, \f itd.). Dlatego łańcuch "C:\Temp\file.txt" jest interpretowany niepoprawnie.
System.out.println("C:\Temp\file.txt"); // Błąd lub nieoczekiwany wynik
Poprawnie:
System.out.println("C:\\Temp\\file.txt"); // Podwójne ukośniki wsteczne
Błąd nr 3: Ignorowanie bloków tekstowych. Począwszy od Java 15 używaj bloków tekstowych — to upraszcza pracę z wielowierszowymi łańcuchami.
String path = """
C:\Temp\file.txt
""";
System.out.println(path);
Najważniejsza zasada: zawsze escapuj znaki specjalne i cudzysłowy. To uchroni przed ukrytymi błędami i zaoszczędzi godziny debugowania.
GO TO FULL VERSION