Специальные символы и управляющие последовательности Java
Используйте управляющие последовательности Java: \n, \t, \\, \", Unicode-экранирование внутри строковых литералов.
Некоторые символы нельзя написать непосредственно внутри строкового литерала — " завершит строку, буквальный перенос строки сломает исходную строку, а обратная косая черта уже имеет особое назначение: она сообщает компилятору «обработай следующее как экранирование». Java решает эту задачу с помощью управляющих последовательностей: коротких кодов с обратной косой чертой, которые заменяют неудобные символы. Отдельный механизм — Unicode-экранирование (\uXXXX) — позволяет записать любую кодовую точку Базовой многоязычной плоскости по её шестнадцатеричному значению.
На этой странице рассматриваются стандартные управляющие последовательности, экранирование внутри char-литералов, Unicode- и восьмеричное экранирование, как текстовые блоки смягчают правила, а также наиболее распространённые ошибки.
Стандартные управляющие последовательности
| Последовательность | Значение |
|---|---|
\n | перевод строки (LF, U+000A) |
\r | возврат каретки (CR, U+000D) |
\t | табуляция (U+0009) |
\b | забой (U+0008) |
\f | перевод страницы (U+000C) |
\" | двойная кавычка |
\' | одинарная кавычка |
\\ | одна обратная косая черта |
\0 | нулевой символ (U+0000) |
\s | пробел (U+0020), добавлен в Java 15 |
Примеры:
String multi = "Line 1\nLine 2\nLine 3";
String quoted = "She said \"hi\"";
String tabbed = "name\tage\tcity";
String path = "C:\\Users\\Ada\\code.java";При выводе управляющие последовательности превращаются в реальные символы:
Line 1
Line 2
Line 3
She said "hi"
name age city
C:\Users\Ada\code.javaВнутри char-литерала
Литерал char заключается в одинарные кавычки. Применяются те же управляющие последовательности, но правила для кавычек меняются: внутри одинарных кавычек необходимо экранировать \', тогда как " можно писать без экранирования. (Внутри строки в двойных кавычках всё наоборот — \" экранируется, а ' пишется как есть.)
char quote = '\''; // a single-quote character
char tab = '\t'; // a tab
char back = '\\'; // one backslash
char dquote = '"'; // no escape needed hereUnicode-экранирование
Чтобы вставить любой символ Базовой многоязычной плоскости, используйте \uXXXX, где XXXX — четырёхзначный шестнадцатеричный номер кодовой точки:
String greeting = "Café"; // "Café"
String pi = "π ≈ 3.14"; // "π ≈ 3.14"
char heart = '♥'; // '♥'Кодовые точки за пределами BMP (большинство эмодзи) требуют суррогатной пары — двух \uXXXX-экранирований, — поэтому почти всегда проще вставить символ непосредственно.
\uXXXX на самом первом проходе, до того как исходный код разбивается на токены. Именно поэтому случайный (перенос строки) внутри строки является ошибкой компиляции, а не переводом строки во время выполнения, и почему \uXXXX допустимо везде — в комментариях, идентификаторах и даже между операторами. Обычные экранирования вроде \n и \t интерпретируются позже, только внутри строковых и char-литералов.Восьмеричное экранирование
\ с последующими 1–3 восьмеричными цифрами (0–7) задаёт символ с соответствующим восьмеричным значением:
char c = '\101'; // 'A' (decimal 65)
char d = '\14'; // form feedТакой синтаксис встречается редко — Unicode-экранирование нагляднее.
Текстовые блоки обходят большинство экранирований
В текстовом блоке (Java 15+) можно писать переносы строк и незакавыченные двойные кавычки буквально — отлично подходит для встраивания JSON, SQL или HTML. Единственные последовательности, которые по-прежнему нужны, — это \\ для буквальной обратной косой черты и \uXXXX для Unicode:
String json = """
{
"name": "Ada",
"tagline": "She invented programming"
}
""";Обратите внимание: ключи "name" и "tagline" не требуют \" — они находятся внутри блока """...""".
Демонстрация
Распространённые ошибки
- Написать
"\n"и ожидать окончаний строк Windows.\n— это только LF. Для корректных переносов строк на конкретной платформе в форматированном выводе используйте%nвнутриprintf/format— он подставляет разделитель строк, принятый в данной ОС. - Забыть экранировать обратные косые черты в регулярных выражениях. Шаблон регулярного выражения сначала является Java-строкой, поэтому проходит через два уровня экранирования. Чтобы сопоставить цифру (
\d), нужно написать строку"\\d"— компилятор превратит\\в одну обратную косую черту, а движок регулярных выражений прочитает\d. Чтобы сопоставить буквальную обратную косую черту, нужно четыре:"\\\\". - Использовать
для вставки переноса строки.и есть кодовая точка переноса строки, и поскольку Unicode-экранирование транслируется до запуска токенизатора, компилятор подставляет настоящий перенос строки посреди строкового литерала — что является синтаксической ошибкой. Используйте\nдля переносов строк внутри строк; оставьте\uXXXXдля печатаемых символов. - Неполное или недопустимое Unicode-экранирование. После
\uдолжны идти ровно четыре шестнадцатеричные цифры."\u12"или"\uZZZZ"— ошибка компиляции, а не буквальная обратная косая черта. Если нужен буквальный\u, экранируйте обратную косую черту:"\\u".
Что дальше
Java Numbers подробно рассматривает числовые типы, их литералы и точность.