Основы Java
Теория: Экранирующие последовательности
Мы хотим показать диалог Матери Драконов со своим ребенком:
Если вывести на экран строку с таким текстом:
Получится так:
Не то, что мы хотели. Строки расположены друг за другом, а не одна ниже другой. Нам нужно как-то сказать интерпретатору «нажать на Enter» — сделать перевод строки после вопросительного знака. Это можно сделать, используя символ перевода строки: \n:
результат:
\n — это специальный символ. В литературе его часто обозначают как LF (Line Feed). Возможно, вы сейчас подумали, что это опечатка, ведь здесь мы видим два символа \ и n, но это не так. С точки зрения компьютера — это один невидимый символ перевода строки:
Почему так сделано? \n — всего лишь способ записать символ перевода строки, но сам перевод строки по своему смыслу – это один символ, правда, невидимый.
Именно поэтому и возникла такая задача. Нужно было как-то представить его на клавиатуре. А поскольку количество знаков на клавиатуре ограничено и отдано под самые важные, то все специальные символы реализуются в виде таких обозначений.
Символ перевода строки не является чем-то специфичным для программирования. Все, кто хоть раз печатал на компьютере, использовал перевод строки, нажимая на Enter.
Во многих редакторах есть опция, позволяющая включить отображение невидимых символов. Эта опция помогает понять, где они находятся, хотя это всего лишь схематичное отображение, ведь у этих невидимых символов нет графического представления:
Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.
\n — это пример экранирующей последовательности (escape sequence). Их еще называют управляющими конструкциями. Хотя таких символов не один десяток, в программировании часто встречаются всего несколько.
Кроме перевода строки, к таким символам относятся:
- Табуляция — разрыв, получаемый при нажатии на кнопку Tab
- Возврат каретки (только в Windows)
Программистам часто нужно использовать перевод строки \n для правильного форматирования текста:
На экран выведется:
Обратите внимание на следующие моменты:
-
Не имеет значения, что стоит перед или после
\n: символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае -
Помните, что строка может содержать один символ или вообще ноль символов. А еще строка может содержать только
\n. Проанализируйте следующий пример:Здесь мы сначала выводим строку «перевод строки», а потом делаем вывод обыкновенной строки. Программа выведет на экран:
Почему перед строкой Dunsen появилось две пустые строки, а не одна? Дело в том, что
System.out.println()при выводе значения автоматически добавляет в конец символ перевода строки.Таким образом, один перевод строки мы указали явно, передав этот символ экранирующей последовательности аргументом в функцию, а второй перевод строки добавлен самой функцией автоматически.
Еще пример кода:
Вывод будет таким:
Сейчас у вас достаточно знаний, чтобы самостоятельно разобраться и понять, почему вывод сформировался именно таким образом.
-
Если нам понадобится вывести
\nименно как текст (два отдельных печатных символа), то можно воспользоваться уже известным нам способом экранирования, добавив еще один\в начале. То есть последовательность\\nотобразится как символы\иn, идущие друг за другом:на экран выйдет:
Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется \r\n — это связано с историческими причинами. Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы: например, когда в команде разработчиков есть пользователи как Windows, так и Linux.
Дело в том, что последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки. Поэтому в среде разработчиков принято всегда использовать \n без \r, так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n.

