Java: Экранирующие последовательности
На этом уроке мы будем пользоваться командой print()
, а не println()
. Отличие команд в том, что println()
автоматически добавляет символ переноса строки. В этом уроке мы попробуем расставить переносы строк вручную. Например, мы хотим показать диалог Матери Драконов со своим ребенком:
- Are you hungry? - Aaaarrrgh!
Если вывести на экран строку с таким текстом:
System.out.print("- Are you hungry?- Aaaarrrgh!");
то получится так:
- Are you hungry?- Aaaarrrgh!
Нам нужно как-то дать команду «нажать на энтер» — сделать перевод строки после вопросительного знака.
В Java \n
— это перевод строки:
System.out.print("- Are you hungry?\n- Aaaarrrgh!");
результат:
- Are you hungry? - Aaaarrrgh!
\n
- это пример экранирующей последовательности (escape sequence). Их ещё называют управляющими конструкциями.
Набирая текст в каком-нибудь Word вы нажимаете на Enter в конце строчки. Редактор при этом ставит в конец строчки специальный невидимый символ, который называется LINE FEED (LF, перевод строчки). В некоторых редакторах можно даже включить отображение невидимых символов. Тогда текст будет выглядеть примерно так:
- Привет!¶ - О, привет!¶ - Как дела?
Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.
Хотя таких символов не один десяток, в программировании часто встречаются всего несколько. Кроме перевода строки, к таким символам относятся табуляция (разрыв, получаемый при нажатии на кнопку Tab) и возврат каретки (только в Windows). Нам, программистам, часто нужно использовать, например, перевод строки \n
для правильного форматирования текста.
System.out.print("Gregor Clegane\nDunsen\nPolliver\nChiswyck");
Внимание! Экранирующие последовательности вроде \n
работают только внутри двойных кавычек!
На экран выведется:
Gregor Clegane Dunsen Polliver Chiswyck
В предыдущих уроках для удобства использовался метод System.out.println()
, который позволяет вывести на консоль некоторое значение с последующим переводом консоли на следующую строку. Например:
System.out.println("Hello");
System.out.println("World");
На экран выведется:
Hello World
Обратите внимание на следующие моменты:
1. Не имеет значения, что стоит перед или после \n
: символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае.
2. Помните, что строка может содержать лишь один символ или вообще ноль символов? А еще строка может содержать только \n
:
System.out.print("Gregor Clegane");
System.out.print("\n");
System.out.print("Dunsen");
Здесь мы выводим одну строку с именем, потом одну строку «перевод строки», а потом еще одну строку. Программа выведет на экран:
Gregor Clegane Dunsen
3. Несмотря на то, что в исходном тексте программы последовательность типа \n
выглядит как два символа, на самом деле это специальный один символ.
4. Если нам понадобится вывести \n
в тексте (например, "В Java \n — это перевод строки"), то мы должны добавить еще один символ \
перед \n
. Тогда, при выводе, последовательность \\n
отобразится в тексте, как символы '\' и 'n' идущие друг за другом. В этом случае перевода на новую строку не будет.
System.out.print("Joffrey loves using \\n"); // => Joffrey loves using \n
Такой же подход используют, если нужно вывести текст в двойных кавычках "": добавляют \
перед символом "
.
System.out.print("Joffrey loves using \""); // => Joffrey loves using "
Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется \r\n
. Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы (например, когда в команде разработчиков есть пользователи как Windows, так и Linux). Дело в том, что последовательность \r\n
имеет разную трактовку в зависимости от выбранной кодировки (рассматривается позже). По этой причине в среде разработчиков принято всегда использовать \n
без \r
, так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n
.
Задание
Напишите программу, которая выводит на экран:
- Did Joffrey agree?
- He did. He also said "I love using \n".
При этом программа использует только один System.out.print()
, но результат на экране должен выглядеть в точности как показано выше.