— Приветствую, Амиго. Когда-то Когда-то давно ты узнал, что чтобы записать в коде строку символов, нужно обернуть эти символы в двойные кавычки.

— Да, и получится строковой литерал. Не так уж давно я об этом узнал.

— По рамкам нашей с тобой профессии — давно. Но речь сейчас не об этом. Ты мне лучше скажи, что делать, если нам нужно, чтобы кавычки были внутри строкового литерала?

— Хм… Строка, содержащая кавычки — что может быть проще. Какое-нибудь название…

— Да. Допустим, мы хотим вывести текст Фильм "Друзья" номинирован на "Оскар". Как это сделать?

— Если честно, понятия не имею. Не могу ничего придумать.

— Логикой до решения не дойдёшь. Давай я тебе покажу сразу на разбираться.

Код Примечания
String s = "Фильм "Друзья" номинирован на "Оскар"";
Этот вариант работать не будет!

— Такой вариант не будет работать, поскольку компилятор считает, что тут записан совсем другой код:

Код Примечания
String s = "Фильм "Друзья" номинирован на "Оскар"";
Этот вариант работать не будет!

— После того, как компилятор встретит двойные кавычки в коде, он будет считать их началом строкового литерала. Следующие двойные кавычки — окончанием строкового литерала.

— Так как же записать в двойные кавычки внутри литерала?

— Способ есть, ему даже дали название — экранирование символов. Ты просто пишешь внутри строки текста кавычки, а перед кавычками добавляешь символ \ (обратная косая черта или обратный слеш или бекслеш, от англ. backslash).

— Вот как будет выглядеть правильно записанный строковой литерал:

Код Примечания
String s = "Фильм \"Друзья\" номинирован на \"Оскар\"";
Это сработает!

— Компилятор все поймет правильно и не будет считать кавычки, расположенные после обратной косой черты, обычными кавычками.

— Более того, если вывести данную строку на экран, кавычки с обратной косой чертой будут правильно обработаны, и на экран будет выведена надпись без обратной косой черты: Фильм "Друзья" номинирован на "Оскар"

— Не скажу, что прямо очень удобно…

— Что делать, таковы правила. Ещё один важный момент. Кавычки, предваренные обратной косой чертой — это один символ: мы просто пользуемся таким хитрым способом записи, чтобы не мешать компилятору распознавать строковые литералы в коде. Ты можешь присвоить кавычки в переменную char:

Код Примечания
char c = '\"';
\" — это один символ, а не два
char c = '"';
так тоже можно: двойная кавычка внутри одинарных кавычек

Часто возникающие ситуации при экранировании символов

— Помимо двойных кавычек, есть еще много символов, которые по-особому обрабатываются компилятором. Например, перенос строки.

— Как добавить в литерал перенос строки? Для этого тоже есть специальная комбинация:

\n
Символ переноса строки

— Если тебе нужно добавить в строковой литерал перенос строки, просто добавь пару символов – \n.

Пример:

Код Вывод на экран
System.out.println("С уважением,\nАноним");
С уважением,
Аноним

— Всего таких специальных комбинаций 8: их еще называют escape-последовательностями, вот они:

Код Описание
\t Вставить символ табуляции
\b Вставить символ возврата на один символ
\n Вставить символ новой строки
\r Вставить символ возврата каретки
\f Вставить символ прогона страницы
\' Вставить одинарную кавычку
\" Вставить двойную кавычку
\\ Вставить обратный слеш

— Две из них ты мне уже показал. А что значат остальные 6?

— Сейчас всё объясню.

Символ табуляции – \t

Данный символ в тексте эквивалентен нажатию на клавиатуре клавиши Tab при наборе текста. Он сдвигает следующий за ним текст с целью его выровнять.

Пример:

Код Вывод на экран
System.out.println("0\t1\t2\t3");
System.out.println("0\t10\t20\t30");
System.out.println("0\t100\t200\t300");
0       1        2        3
0       10       20       30
0       100      200      300

Возврат на один символ назад – \b

Данный символ в тексте эквивалентен нажатию на клавиатуре клавиши Backspace при наборе текста. Он удаляет последний выведенный символ перед ним:

Код Вывод на экран
System.out.println("Привет\b\b Мир");
Прив Мир!

Символ возврата каретки – \r

Этот символ переносит курсор в начало текущей строки, не меняя текста. Следующий выводимый текст будет перетирать существующий.

Пример:

Код Вывод на экран
System.out.println("Привет\rМир!");
Мир!

Символ прогона страницы – \f

Это символ дошел до нас из эпохи первых матричных принтеров. Если подать такой символ на печать, это приводило к тому, что принтер просто прокручивал текущий лист, не печатая текст, пока не начнется новый.

Сейчас бы мы назвали его разрыв страницы или новая страница.

Обратный слэш – \\

Ну а тут вообще все просто. Если мы используем обратную косую черту (обратный слэш) в тексте, чтобы экранировать символы, то как тогда записать в текстовой строке сам символ косой черты?

Все просто: чтобы добавить в текст символ обратной косой черты, его нужно написать два раза подряд.

Пример:

Код Вывод на экран
System.out.println("c:\projects\my\first");
Компилятор будет ругаться на неизвестные экранированные символы.
System.out.println("c:\\projects\\my\\first");
Вот так правильно!
9
Задача
Java Syntax Pro Beta,  9 уровень3 лекция
Недоступна
Импорты: Part 1
В классе Solution замени все короткие имена классов в коде на полные.

— Двойной слэш — это логично. А вот всё остальное сразу не запомню. Придётся пользоваться твоими подсказками.

— Постепенно запомнишь то, что нужно. Не переживай. А для остального есть Google.

Кодировка Unicode

— Ты уже знаешь, что каждому символу, отображаемому на экране, соответствует определенный числовой код. Стандартизированный набор таких кодов называют кодировкой.

— Когда-то давно, когда только изобрели компьютеры, для кодировки всех символов было достаточно семи бит (меньше одного байта) – первая кодировка содержала всего 128 символов. Называлась такая кодировка ASCII.

— Странное название.

— Ничего странного. Это сокращение такое. ASCII (англ. American Standard Code for Information Interchange) — американская стандартная кодировочная таблица для печатных символов и некоторых специальных кодов.

— Она состояла из 33 непечатных управляющих символов (влияющих на обработку текста и пробелов) и 95 печатных символов, включая цифры, буквы латинского алфавита в строчном и прописном вариантах и ряд пунктуационных символов.

— Рост популярности компьютеров привел к тому, что каждая страна начала выпускать свою кодировку. Обычно за основу брали ASCII и заменяли редко используемые символы на символы национальных алфавитов.

— Со временем появилась идея: создать одну кодировку, в которой разместить все символы всех мировых кодировок.

— Так в 1993 году была создана кодировка Unicode, и язык Java был первым языком программирования, который использовал ее как стандарт хранения текста. Сейчас же Unicode — стандарт всей ИТ-индустрии.

— И хотя Unicode сам по себе является стандартом, у него есть несколько форм представления (Unicode transformation format, UTF): UTF-8, UTF-16 и UTF-32, и пр.

— В Java используется продвинутая разновидность кодировки Unicode – UTF-16: каждый символ в которой кодировался 16 битами (2 байтами). Она способна вместить до 65,536 символов! В этой кодировке можно найти почти все символы всех алфавитов мира.

— Я надеюсь, её не нужно знать наизусть?

— Хочешь — рискни!

— Ладно-ладно. Воспользуюсь правилом: “нельзя знать всё, но всё можно загуглить”.

— Рациональный подход — наше всё. Так вот, чтобы записать в коде программы символ кодировки Unicode по его коду, нужно написать \u + шестнадцатеричные цифры кода. Например \u00A9

Код Вывод на экран
System.out.println("\u00A9 JavaRush");
© JavaRush
9
Задача
Java Syntax Pro Beta,  9 уровень3 лекция
Недоступна
Импорты: Part 2
В классе Solution замени все полные имена классов в коде на короткие.

Unicode: codepoint

— “640 Килобайт хватит всем! Или нет”. Так когда сказал Билл Гейтс. Или не говорил. По крайней мере, эту цитату ему приписывают.

— Ха-ха. Да 640 килобайт не хватит, чтобы загрузить даже мозг робота-уборщика.

— Жизнь — суровая штука, и кодировки UTF-16 со временем стало не хватать. Оказалось, что в Азии очень много языков, а у них очень много иероглифов. И все иероглифы просто невозможно засунуть в 2 байта.

— И что же делать?

— Использовать больше байт! Вот только тип char занимает всего 2 байта и поменять его на 4 не так просто: в мире написаны миллиарды строк кода на Java, которые будут работать неправильно, если вдруг в Java-машине тип char станет 4 байта. Так что менять тип char нельзя!

— Есть и другой подход. Вспомни, как мы экранируем символы с помощью префикса в виде косой черты. Мы, по сути, кодировали один символ с помощью нескольких символов. Этот же подход решили использовать и разработчики Java.

— Некоторые символы, которые визуально выглядят как один символ, в строке кодируются двумя char'ами:

Код Вывод на экран
System.out.println("\uD83D\uDD0A");
🔊

— Теперь твоя программа на Java может выводить в консоль даже emoji 😎

— Обязательно воспользуюсь на досуге!