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, які працюватимуть неправильно, якщо зненацька тип char в Java-машині збільшиться до 4 байтів. Отже, змінювати тип char не можна!
Натомість є інший спосіб. Згадайте, як ми екранували символи за допомогою префікса у вигляді скісної риски. Ми, по суті, кодували один символ за допомогою декількох символів.
Розробники Java вирішили використати такий самий підхід.
Деякі символи, що візуально виглядають як один символ, у рядку кодуються двома char
'ами:
Код | Виведення на екран |
---|---|
|
|
Тепер ваша програма на Java зможе виводити в консоль навіть смайлики 😎