Щось пішло не так! Ця стаття писалася як виконання тестового завдання посаду у команді JavaRush. І писалася як повноцінна лекція. За рахунок цього гарантую вам якість і кількість корисних знань, що накопичабося в цьому пості. Крім практичної та теоретичної інформації, у статті є цікаві факти, про які ви могли навіть не здогадуватися!
Hello World!
Екранування символів— це дуже цікаве та необхідне технічне рішення. Необхідність у екрануванні символів зіграло значної ролі історія всієї індустрії програмування. У цій статті ми поговоримо про те, що таке екранування символів, чому виникла потреба їх екранувати, і як екранування символів реалізовано Java. У статті наведено приклади та цікаві факти, пов'язані з темою екранування символів. Приємного читання! Вся інформація в комп'ютерній системі представлена у вигляді тексту, який нижчому рівні представлений байтами. Коли ми пишемо листа чи повідомлення, ми набираємо текст, який буде зрозумілий для людини. Коли ми пишемо код у IDE, ми набираємо текст, який зможе розібрати компілятор. У Java текст можна подати у вигляді типу
String
для позначення даних якого використовуються керуючі символи - парні лапки.
String str = "Hello World!";
З текстом Hello World! ніяких проблем не виникає, але якщо цей текст необхідно виділити прямою мовою? Скориставшись правилами граматики стає ясно, що текст “Hello World!”, окрім керуючих символів від типу
String
, потрібно помістити в лапки прямої мови.
String str = "Java said, "Hello World!"";
Такий випадок буде неробочим, т.к. компілятор просто не зрозуміє в який момент закінчується ініціалізація змінної
str
. Для вирішення цієї та подібних їй проблем було придумано
екранувати символи , тобто змінювати
керуючі символи на так звані послідовності, що управляють, відомі також, як
escape-послідовності . Нижче наведено список діючих escape-послідовностей java для використання у рядках.
\t
- Символ табуляції (у java - еквівалент чотирьох прогалин);
\b
- Символ повернення в тексті на один крок назад або видалення одного символу в рядку (backspace);
\n
- Символ переходу на новий рядок;
\r
- Символ повернення каретки;
\f
- Прогін сторінки до початку наступної сторінки;
\'
- Символ одинарної лапки;
\"
- символ подвійної лапки;
\\
— Символ зворотної косої межі (
\
). Тепер давайте виділимо пряме мовлення у нашій фразі те щоб компілятор зміг без проблем розібрати написане.
String str = "Java said, \"Hello World!\"";
Таким чином, написаний текст зрозумілий і компілятор і людині, якщо вміст змінної
str
вивести на екран. Ми розібралися з тим, що таке екранування символів і для чого воно потрібне. І навіть екранували символ подвійної лапки! Приступимо до розбору escape-послідовностей, що залишабося.
Символ табуляції у рядку позначається escape-послідовністю
\t
та є аналогом чотирьох прогалин. Однак, якщо довжина рядка, що складається з чотирьох пробілів, дорівнює довжині чотирьох символів, то довжина рядка з символом табуляції дорівнюватиме одному. Символ табуляції часто використовується для побудови таблиць чи
псевдографічних елементів інтерфейсу, т.к. це зручніше запису чотирьох прогалин. Нижче наведено приклад псевдографічного інтерфейсу.
Серед усіх escape-послідовностей символ
\b
мабуть найцікавіший, адже він дозволяє нам видалити останній символ у рядку виведення, подібно, якби ми прали його натисканням клавіші
backspace .
System.out.print("2 + 2 = 5");
System.out.print("\b");
System.out.print("4");
Символи
\n
і
\r
мають спільну історію – розглянемо їх разом. Зі символом перенесення рядка
\n
ви могли зустрічатися раніше. Наприклад, якщо метод
println()
виводить інформацію так, що наступний висновок буде з нового рядка, то метод
print()
не виконує перенесення рядка після виведення, але якщо додати в кінець виводу символ
\n
, то перенесення рядка буде виконано.
System.out.print("Наступний висновок буде з нового рядка\n");
System.out.println("Наступний висновок буде з нового рядка");
Символ повернення каретки
\r
дозволяє нам повернути курсор до початку рядка виведення та відображати нову інформацію так, ніби раніше у цьому рядку нічого не було.
System.out.print("Текст, який потрібно переписати.");
System.out.print('\r');
System.out.print("Новий текст.");
Насправді повернення каретки бере початок ще з часів, коли текст друкували на друкарських машинках. Щоб виконати перенесення рядка, необхідно було пересунути каретку та опустити важіль (частини механізму друкарської машинки), після чого буде виконано перенесення рядка. Якщо ж важіль не опустити, можна було продовжувати друкувати у тому рядку. Що ми спостерігаємо, виводячи символ
\r
. У зв'язку з цим, коли програміст хотів виконати перенесення рядка, він, за звичкою, наприкінці виводу виконував послідовність із символів
\r\n
. Коли ера друкарських машинок добігла кінця, з'явилося покоління програмістів, які все ще використовували цю послідовність, хоча самі за друкарською ніколи не працювали. Вони часто забували в якому порядку необхідно було виконати цю послідовність —
\r\n
або
\n\r
. Тоді їм на допомогу прийшло перевірочне слово
return
, де видно порядок виведення цих символів. Однак пізніше при розробці програмного забезпечення на перші версії Windows після MS-DOS програмісти змушені були використовувати послідовність
\r\n
. Зараз про це можна не турбуватися і для перенесення рядка використовувати тільки символ
\n
.
Повернемося ще раз у минуле, приблизно у 80-ті роки. Саме тоді символ прогону сторінки
\f
на початок наступної сторінки мав популярність. У той час були великі лінійні принтери, для роботи з якими необхідно було писати програмний код, що містить і як принтер повинен надрукувати. І для позначення, що текст необхідно почати друкувати з нової сторінки, використовувався символ.
\f
. В наш час цей символ давно втратив свою актуальність, і навряд чи ви з ним коли-небудь зіткнетеся. Розміри лінійного принтера дуже значні.
З символами
\’
і
\\
так само як і з екрануванням подвійної лапки, приклад був на початку статті. Екранувати одинарну лапку доведеться, наприклад, для ініціалізації типу char одинарною лапкою.
char ch = '\'';
Екранувати символ зворотної косої риси необхідно для вказівки, що наступний символ не буде частиною escape-послідовності.
System.out.println("\\n - escape-послідовність перенесення рядка");
На практиці ж екранувати зворотний сліш частіше доводиться під час роботи з шляхами:
System.out.println("It's Java string: \"C:\\Program Files\\Java\\jdk1.7.0\\bin\"");
Я підкреслив, що дані escape-послідовності використовуються у рядках (рядкових літералах), т.к. решта їх частина використовується для опису регулярних виразів класу
Pattern
і не відноситься до теми цієї статті.
Тут можна ознайомитись зі списком всіх escape-послідовностей класу
Pattern
. Однак, варто відзначити, що регулярні вирази в тому вигляді, в якому вони є зараз, неможливо уявити без використання escape-послідовностей не тільки в java, але й в інших популярних програмах, наприклад, PHP. У java екранування символів використовується у форматуванні рядків. Наприклад, задаючи формат рядка для відображення символу відсотка, необхідно продублювати символ відсотка –
%%
, інакше отримаємо помилку, а IDE пропонуватиме дописати відсоток.
System.out.printf("Відсоток жирності молока: %d%%", 10);
На цьому стаття добігає кінця. Сподіваюся, ви дізналися багато нового про екранування символів і про те, як застосовувати це на практиці. Екранування символів притаманне багатьма мовами програмування. У java, як і в інших сі-подібних мовах, дана технологія реалізована майже однаково. Тому, отримані вами знання з цієї статті цілком можуть стати в нагоді не тільки в java. Дякуємо за увагу та удачі в навчанні!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ