1. Причины возникновения экранирования символов
Когда-то давно вы узнали, что чтобы записать в коде строку символов, нужно обернуть эти символы в двойные кавычки: получится строковой литерал.
А что делать, если нам нужно, чтобы кавычки были внутри строкового литерала? Строка, содержащая кавычки — что может быть проще.
Допустим, мы хотим вывести текст Фильм "Друзья" номинирован на "Оскар"
. Как это сделать?
Код | Примечания |
---|---|
|
Этот вариант работать не будет! |
Все дело в том, что по мнению компилятора тут записан совсем другой код:
Код | Примечания |
---|---|
|
Этот вариант работать не будет! |
После того, как компилятор встретит двойные кавычки в коде, он будет считать их началом строкового литерала. Следующие двойные кавычки — окончанием строкового литерала.
Так как же записать в двойные кавычки внутри литерала?
2. Экранирование символов
Способ есть, ему даже дали название — экранирование символов. Вы просто пишете внутри строки текста кавычки, а перед кавычками добавляете символ \
(обратная косая черта или обратный слеш или бекслеш, от англ. backslash).
Вот как будет выглядеть правильно записанный строковой литерал:
Код | Примечания |
---|---|
|
Это сработает! |
Компилятор все поймет правильно и не будет считать кавычки, расположенные после обратной косой черты, обычными кавычками.
Более того, если вывести данную строку на экран, кавычки с обратной косой чертой будут правильно обработаны, и на экран будет выведена надпись без обратной косой черты: Фильм "Друзья" номинирован на "Оскар"
Еще важный момент. Кавычки, предваренные обратной косой чертой — это один символ: мы просто пользуемся таким хитрым способом записи, чтобы не мешать компилятору распознавать строковые литералы в коде. Вы можете присвоить кавычки в переменную char
:
Код | Примечания |
---|---|
|
\" — это один символ, а не два |
|
так тоже можно: двойная кавычка внутри одинарных кавычек |
3. Часто возникающие ситуации при экранировании символов
Кроме двойных кавычек, есть еще много символов, которые по-особому обрабатываются компилятором. Например, перенос строки.
Как добавить в литерал перенос строки? Для этого тоже есть специальная комбинация:
\n
Если вы хотите добавить в строковой литерал перенос строки, вам нужно просто добавить пару символов – \n
.
Пример:
Код | Вывод на экран |
---|---|
|
|
Всего таких специальных комбинаций 8: их еще называют escape-последовательностями, вот они:
Код | Описание |
---|---|
\t |
Вставить символ табуляции |
\b |
Вставить символ возврата на один символ |
\n |
Вставить символ новой строки |
\r |
Вставить символ возврата каретки |
\f |
Вставить символ прогона страницы |
\' |
Вставить одинарную кавычку |
\" |
Вставить двойную кавычку |
\\ |
Вставить обратный слеш |
С двумя из них вы познакомились, а что значат остальные 6?
Символ табуляции – \t
Данный символ в тексте эквивалентен нажатию на клавиатуре клавиши Tab
при наборе текста. Он сдвигает следующий за ним текст с целью его выровнять.
Пример:
Код | Вывод на экран |
---|---|
|
|
Возврат на один символ назад – \b
Данный символ в тексте эквивалентен нажатию на клавиатуре клавиши Backspace
при наборе текста. Он удаляет последний выведенный символ перед ним:
Код | Вывод на экран |
---|---|
|
|
Символ возврата каретки – \r
Этот символ переносит курсор в начало текущей строки, не меняя текста. Следующий выводимый текст будет перетирать существующий.
Пример:
Код | Вывод на экран |
---|---|
|
|
Символ прогона страницы – \f
Это символ дошел до нас из эпохи первых матричных принтеров. Если подать такой символ на печать, это приводило к тому, что принтер просто прокручивал текущий лист, не печатая текст, пока не начнется новый.
Сейчас бы мы назвали его разрыв страницы или новая страница.
Обратный слэш – \\
Ну а тут вообще все просто. Если мы используем обратную косую черту (обратный слэш) в тексте, чтобы экранировать символы, то как тогда записать в текстовой строке сам символ косой черты?
Все просто: чтобы добавить в текст символ обратной косой черты, его нужно написать два раза подряд.
Пример:
Код | Вывод на экран |
---|---|
|
Компилятор будет ругаться на неизвестные экранированные символы. |
|
Вот так правильно! |
4. Кодировка 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
Код | Вывод на экран |
---|---|
|
|
5. Unicode: codepoint
640 Килобайт хватит всем! Или нет. (Цитата, приписываемая Биллу Гейтсу)
Жизнь — суровая штука, и кодировки UTF-16 со временем стало не хватать. Оказалось, что в Азии очень много языков, а у них очень много иероглифов. И все иероглифы просто невозможно засунуть в 2 байта.
И что же делать? Использовать больше байт!
Вот только тип char занимает всего 2 байта и поменять его на 4 не так просто: в мире написаны миллиарды строк кода на Java, которые будут работать неправильно, если вдруг в Java-машине тип char станет 4 байта. Так что менять тип char нельзя!
Есть и другой подход. Вспомните, как мы экранировали символы с помощью префикса в виде косой черты. Мы, по сути, кодировали один символ с помощью нескольких символов.
Этот же подход решили использовать и разработчики Java.
Некоторые символы, которые визуально выглядят как один символ, в строке кодируются двумя char
'ами:
Код | Вывод на экран |
---|---|
|
|
Теперь ваша программа на Java может выводить в консоль даже emoji 😎
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ