W3docs

Специальные символы и управляющие последовательности 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 here

Unicode-экранирование

Чтобы вставить любой символ Базовой многоязычной плоскости, используйте \uXXXX, где XXXX — четырёхзначный шестнадцатеричный номер кодовой точки:

String greeting = "Café";       // "Café"
String pi = "π ≈ 3.14";   // "π ≈ 3.14"
char heart = '♥';               // '♥'

Кодовые точки за пределами BMP (большинство эмодзи) требуют суррогатной пары — двух \uXXXX-экранирований, — поэтому почти всегда проще вставить символ непосредственно.

Примечание
Unicode-экранирование отличается от всех остальных управляющих последовательностей: компилятор переводит \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" не требуют \" — они находятся внутри блока """...""".

Демонстрация

java— editable, runs on the server

Распространённые ошибки

  • Написать "\n" и ожидать окончаний строк Windows. \n — это только LF. Для корректных переносов строк на конкретной платформе в форматированном выводе используйте %n внутри printf / format — он подставляет разделитель строк, принятый в данной ОС.
  • Забыть экранировать обратные косые черты в регулярных выражениях. Шаблон регулярного выражения сначала является Java-строкой, поэтому проходит через два уровня экранирования. Чтобы сопоставить цифру (\d), нужно написать строку "\\d" — компилятор превратит \\ в одну обратную косую черту, а движок регулярных выражений прочитает \d. Чтобы сопоставить буквальную обратную косую черту, нужно четыре: "\\\\".
  • Использовать для вставки переноса строки. и есть кодовая точка переноса строки, и поскольку Unicode-экранирование транслируется до запуска токенизатора, компилятор подставляет настоящий перенос строки посреди строкового литерала — что является синтаксической ошибкой. Используйте \n для переносов строк внутри строк; оставьте \uXXXX для печатаемых символов.
  • Неполное или недопустимое Unicode-экранирование. После \u должны идти ровно четыре шестнадцатеричные цифры. "\u12" или "\uZZZZ" — ошибка компиляции, а не буквальная обратная косая черта. Если нужен буквальный \u, экранируйте обратную косую черту: "\\u".

Что дальше

Java Numbers подробно рассматривает числовые типы, их литералы и точность.

Практика

Практика
Какая управляющая последовательность представляет одну обратную косую черту внутри строкового литерала?
Какая управляющая последовательность представляет одну обратную косую черту внутри строкового литерала?
Was this page helpful?