1. Основные спецсимволы и экранирование
В программировании строки состоят не только из букв, но и специальных символов: кавычки, переводы строки, табуляции, а иногда даже значки типа \n и \t. Но если вы захотите написать в строке Привет, "user"!, компилятор сразу же спросит: «А кавычки внутри строки — это что, ошибка?». Вот тут и нужен механизм экранирования.
В Java экранирование — это способ "указывать особое отношение" к некоторым символам внутри строки. Для этого используется обратный слэш \ (он же «backslash»).
Классические спецсимволы:
| Последовательность | Описание | Демонстрация |
|---|---|---|
|
Перенос строки | Нажал Enter |
|
Табуляция | Таб |
|
Буквально "обратный слэш" | |
|
Кавычка внутри строки | |
|
Одинарная кавычка (редко нужно в строках) | |
|
Возврат каретки (старый стиль переноса строки, редко используется) | |
|
Null-символ | (Невидимый) |
|
Backspace (удаляет предыдущий символ — в консоли работает не всегда) |
Как это работает
Давайте напишем пару строк с экранированными символами, чтобы увидеть их в действии.
System.out.println("Привет, \"Пользователь\"!");
// Вывод: Привет, "Пользователь"!
System.out.println("C:\\Program Files\\MyApp");
// Вывод: C:\Program Files\MyApp
System.out.println("Строка 1\nСтрока 2");
// Вывод:
// Строка 1
// Строка 2
System.out.println("Я\tлюблю\tтабуляцию!");
// Вывод:
// Я люблю табуляцию!
Вот так, с помощью одной простой черточки (\), вы можете «протащить» в строку почти любой спецсимвол, не вызывая панику у компилятора или коллеги по команде.
2. Многострочные строки и переносы
Очень часто нужно написать многострочное сообщение или ASCII-арт. Самый прямолинейный способ — воспользоваться \n в обычной строке.
System.out.println("Первая строка\nВторая строка\nТретья строка");
Однако это не всегда удобно, поэтому в Java появились текстовые блоки (Text Blocks). Они начинаются с тройных кавычек """ и позволяют писать многострочный текст без экранирования, сохраняя форматирование — идеально для JSON, SQL и HTML.
// Многострочный литерал (Text Block)
String json = """
{
"name": "Alice",
"age": 30,
"skills": ["Java", "SQL", "Cloud"]
}
""";
System.out.println(json);
"""
С помощью текстовых блоков также можно легко создавать многострочный текст, который включает в себя кавычки, не дублируя их.
3. Unicode — как в Java хранятся любые символы мира
В современном мире мы работаем не только с латиницей, но и с кириллицей, иероглифами, математическими символами и даже эмодзи. Всё это возможно благодаря системе кодирования символов — Unicode.
Что такое Unicode?
Unicode — это международный стандарт, который присваивает уникальный номер (code point) каждому символу, независимо от языка и платформы. Благодаря этому вы можете легко использовать в Java одновременно кириллический текст, английский, китайские иероглифы и даже редкие спецсимволы.
Пример строки на разных языках:
System.out.println("Hello, мир! 你好! مرحبا!");
Unicode-символы в строках
Вы можете напрямую писать любые символы, поддерживаемые вашей кодировкой, или использовать escape-последовательности вида \uXXXX, где XXXX — 4-значный шестнадцатеричный код символа.
System.out.println("Символ: \u263A"); // Выведет 😊
Для символов с кодом больше 65535 (например, многие смайлики) используется пара суррогатов (UTF-16):
// Символ 😊 (код 1F60A) представлен двумя char
System.out.println("Смайлик: \uD83D\uDE0A"); // Выведет 😊
Что это вам даёт?
- Вы можете хранить и обрабатывать любой текст.
- Не бойтесь смешивать языки и использовать нестандартные символы — Java поддерживает Unicode «из коробки».
- Особенно важно при работе с международными пользователями и нестандартными алфавитами.
4. Смайлики и спецсимволы в строках
Современные строки — это не только буквы, но и эмодзи! Например, вы хотите отправить пользователю весёлое сообщение с «улыбочкой».
Как добавить смайлик в строку?
Вставьте эмодзи напрямую в строку:
System.out.println("Привет! 😊");
Используйте Unicode-коды: для большинства смайликов можно использовать последовательности суррогатов.
System.out.println("Вот котик: \uD83D\uDC31"); // 🐱
Смайлики могут занимать два символа в строке (из-за UTF-16). Поэтому при некоторых операциях (например, получение длины) возможны сюрпризы:
String s = "😊";
System.out.println(s.length()); // Выведет 2, а не 1!
Это связано с тем, что один Unicode code point кодируется двумя char в Java. Для корректной работы с символами используйте code points и соответствующие методы вместо простого length().
5. Подводные камни и частые ошибки
Ошибка №1: Неправильное использование кавычек внутри строки. Если не экранировать внутренние кавычки, компилятор «думает», что строка закончилась.
System.out.println("Он сказал: "Привет!""); // Ошибка!
Правильно:
System.out.println("Он сказал: \"Привет!\"");
Ошибка №2: Одинарный обратный слэш в пути. В Java \ используется для спецсимволов (\n, \t, \f и др.). Поэтому строка "C:\Temp\file.txt" интерпретируется неверно.
System.out.println("C:\Temp\file.txt"); // Ошибка или неожиданный результат
Правильно:
System.out.println("C:\\Temp\\file.txt"); // Двойные слэши
Ошибка №3: Игнорирование текстовых блоков. Начиная с Java 15 используйте текстовые блоки — это упрощает работу с многострочными строками.
String path = """
C:\Temp\file.txt
""";
System.out.println(path);
Главное правило: всегда экранируйте спецсимволы и кавычки. Это избавит от скрытых багов и сэкономит часы отладки.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ