1. Чому виникла потреба в екрануванні символів?

Колись давно ви дізналися, що для того щоб записати в коді рядок символів, потрібно взяти цей рядок у подвійні лапки: це буде рядковий літерал.

А що робити, коли потрібно написати рядковий літерал з лапками всередині? Рядок, який містить лапки, — що може бути простішим?

Припустімо, ми хочемо вивести текст Фільм "Друзі" номіновано на "Оскар". Як це зробити?

Код Примітки
String s = "Фільм "Друзі" номіновано на "Оскар"";
Цей варіант не працюватиме!

Річ у тім, що на думку компілятора тут записано зовсім інший код:

Код Примітки
String s = "Фільм "Друзі" номіновано на "Оскар"";
Цей варіант не працюватиме!

Коли компілятор зустріне подвійні лапки в коді, він вважатиме їх початком рядкового літерала, а наступні подвійні лапки — закінченням цього рядкового літерала.

То як же записати подвійні лапки всередині літерала?


2. Екранування символів

Спосіб є — він має назву екранування символів. Потрібно просто додати перед лапками всередині рядка тексту символ \ (обернена скісна риска, або обернений слеш, або бекслеш, від англ. backslash).

Отакий вигляд має правильно записаний рядковий літерал:

Код Примітки
String s = "Фільм \"Друзі\" номіновано на \"Оскар\"";
Це працюватиме!

Компілятор усе зрозуміє правильно й не вважатиме лапки після оберненої скісної риски звичайними лапками.

До того ж, якщо потрібно вивести цей рядок на екран, лапки з оберненою скісною рискою будуть оброблені правильно, і на екран буде виведено напис без обернених скісних рисок: Фільм "Друзі" номіновано на "Оскар"

Ще один важливий момент. Лапки з оберненою скісною рискою перед ними — це один символ: ми просто користуємося таким хитрим способом запису, щоб компілятор міг правильно розпізнати рядкові літерали в коді. Лапки можна присвоїти змінній char:

Код Примітки
char c = '\"';
\" — це один символ, а не два
char c = '"';
так теж можна: подвійна лапка між одинарними лапками

3. Типові ситуації під час екранування символів

Типові ситуації під час екранування символів

Крім подвійних лапок, є ще багато символів, які компілятор обробляє в особливий спосіб. Наприклад, переведення рядка.

Як додати в літерал переведення рядка? Для цього теж є спеціальна комбінація:

\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");
Отак правильно!

1
Задача
Модуль 1. Java Syntax,  11 рівень1 лекція
Недоступна
Вісімковий конвертер
Публічний статичний метод toOctal(int) має перетворювати ціле число, отримане як вхідний параметр, з десяткової системи числення у вісімкову. А публічний статичний метод toDecimal(int) навпаки — з вісімкової системи в десяткову. Методи діють лише для додатних чисел. Якщо вхідний параметр дорівнює аб

4. Кодування Unicode

Як ви вже знаєте, кожному символу, що відображається на екрані, відповідає певний числовий код. Стандартизований набір таких кодів називають кодуванням.

У давні часи, коли комп'ютери тільки-но винайшли, для кодування всіх символів було достатньо семи бітів (менше одного байта) — перша таблиця кодування містила лише 128 символів. Це кодування має назву ASCII.

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

Вона містила 33 недруковані керівні символи (що впливають на обробку тексту й пробілів) і 95 друкованих символів: цифри, малі та великі літери латинського алфавіту й розділові знаки.

Кодування Unicode

Внаслідок зростання популярності комп'ютерів кожна країна почала створювати своє кодування. Зазвичай за основу брали кодування 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

1
Задача
Модуль 1. Java Syntax,  11 рівень1 лекція
Недоступна
Двійковий конвертер
Публічний статичний метод toBinary(int) має перетворювати ціле число, отримане як вхідний параметр, з десяткової системи числення у двійкову й повертати рядкове подання цього числа. А публічний статичний метод toDecimal(String) навпаки — має перетворювати рядкове подання двійкового числа на десятков

5. Unicode: codepoint

640 кілобайт вистачить усім! Або ні. (Цей вислів приписують Біллу Гейтсу).

Життя — сувора штука, і кодування UTF-16 з часом стало не вистачати. Раптом з'ясувалося, що в Азії є ціла купа мов, а в цих мовах є ціла купа найрізноманітніших літер та ієрогліфів. І всі ці літери та ієрогліфи жодним чином неможливо втиснути у 2 байти.

І що ж робити? Використовувати більше байтів!

Однак тип char має лише 2 байти, і змінити його розмір на 4 байти не так просто: у світі написано мільярди рядків коду мовою Java, які працюватимуть неправильно, якщо зненацька тип char в Java-машині збільшиться до 4 байтів. Отже, змінювати тип char не можна!

Натомість є інший спосіб. Згадайте, як ми екранували символи за допомогою префікса у вигляді скісної риски. Ми, по суті, кодували один символ за допомогою декількох символів.

Розробники Java вирішили використати такий самий підхід.

Деякі символи, що візуально виглядають як один символ, у рядку кодуються двома char'ами:

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

Тепер ваша програма на Java зможе виводити в консоль навіть смайлики 😎


1
Задача
Модуль 1. Java Syntax,  11 рівень1 лекція
Недоступна
Шістнадцятковий конвертер
Публічний статичний метод toHex(int) має перетворювати ціле число, отримане як вхідний параметр, з десяткової системи числення у шістнадцяткову й повертати рядкове подання цього числа. А публічний статичний метод toDecimal(String) навпаки — має перетворювати рядкове подання шістнадцяткового числа на