JavaRush/Java блог/Random UA/Екранування символів

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

Стаття з групи Random UA
учасників
Вітання! У минулих лекціях ми вже встигли познайомитися з рядками, які у Java представлені класом String. Як ти, мабуть, пам'ятаєш, рядок – це послідовність символів. Символи можуть бути будь-якими — літери, цифри, розділові знаки і так далі. Головне, щоб при створенні рядка вся послідовність полягала в лапках:
public class Main {
   public static void main(String[] args) {
       String sasha = new String ("Меня зовут Саша, мне 20 лет!");
   }
}
Але що буде, якщо нам потрібно створити рядок, усередині якого теж є лапки? Наприклад, ми хочемо розповісти світові про свою улюблену книгу:
public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - "Сумерки" Стефани Майер");
   }
}
Здається, компілятор чимось незадоволений! Як гадаєш, у чому може бути причина помилки, і чому вона виникла саме з лапками? Справа в тому, що компілятор сприймає лапки строго певним чином, а саме - обертає в них рядок. І щоразу, коли він бачить символ ", він очікує, що для нього далі слідуватиме такий самий символ, а між ними буде знаходитись текст рядка, який він, компілятор, повинен створити. У нашому випадку лапки навколо слова "Сутінки" знаходяться всередині інших лапок. І коли компілятор сягає цього шматка тексту, він просто не розуміє, що від нього хочуть. Начебто стоїть лапка, а отже, він має створити рядок. Але ж він це вже робить! Саме в цьому є причина. Говорячи по-простому, тут компілятор неправильно розуміє, що від нього хочуть. "Ще одна лапка? Це якась помилка? Адже я вже створюю рядок! Або я маю створити ще одну? Ееее...:/" Нам потрібно пояснити компілятору , коли лапка є для нього командою ("створи рядок!"), а коли вона є простим символом ("виведи на екран слово "Сутінки" разом із лапками!"). Для цього в Java використовується екранування символів . Воно здійснюється за допомогою спеціального символу. Ось такого:\. У звичайному житті він називається "зворотний слеш", але в Java він (у поєднанні з символом, який потрібно екранувати) називається послідовністю, що управляє . Наприклад, \"ось вона керуюча послідовність для виведення на екран лапки. Зустрівши таку конструкцію всередині твого коду, компілятор зрозуміє, що це просто символ "лапка", який потрібно вивести на екран. Спробуємо змінити наш код із книгою:
public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - \"Сумерки\" Стефани Майер");
       System.out.println(myFavoriteBook);
   }
}
Ми екранували дві "внутрішні" лапки за допомогою символу \. Спробуємо запустити метод main()... Висновок у консоль:

Моя любимая книга - "Сумерки" Стефани Майер
Добре, код відпрацював саме так, як було потрібно! Лапки — далеко не єдиний випадок, коли нам знадобиться екранування символів. Наприклад, ми захотіли розповісти комусь про свою роботу:
public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
І знову помилка! Вже здогадуєшся, у чому причина? Компілятор знову не розуміє, що робити. Адже символ \для нього — ні що інше, як послідовність, що управляє ! Він очікує, що після слеша повинен слідувати якийсь символ, який він повинен якось по-особливому інтерпретувати (наприклад, лапка). Однак тут потім \йдуть звичайні літери. Тому компілятор знову спантеличений. Що робити? Рівно те саме, що й минулого разу: лише додати до нашого \ще один \!
public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
Подивимося, що з цього вийде: Висновок у консоль:

Мои рабочие файлы лежат в папке D:\Work Projects\java
Супер! Компілятор моментально визначив, що \звичайні символи, які потрібно вивести в консоль разом з рештою. У Java існує чимало керуючих послідовностей. Ось їх повний список:
  • \t символ табуляції.
  • \b символ повернення в тексті на один крок назад або видалення одного символу в рядку (backspace).
  • \n символ переходу на новий рядок.
  • \r символ повернення каретки.
  • \f прогін сторінки.
  • \' символ одинарної лапки.
  • \" символ подвійної лапки.
  • \\символ зворотної косої межі (\).
Таким чином, якщо компілятор зустріне в тексті символ \n, він зрозуміє, що це не просто символ і літера, які потрібно вивести в консоль, а спеціальна команда для нього - зроби перенесення рядка! Наприклад, це може нам стати в нагоді, якщо ми хочемо вивести в консоль шматок вірша:
public class Main {
   public static void main(String[] args) {
       String borodino = new String ("Скажи-ка, дядя, \nВедь не даром \nМосква, спаленная пожаром, \nФранцузу отдана?");
       System.out.println(borodino);
   }
}
І ось що ми отримали: Висновок у консоль:

Скажи-ка, дядя, 
Ведь не даром 
Москва, спаленная пожаром, 
Французу отдана?
Те що потрібно! Компілятор розпізнав послідовність, що управляє, і вивів шматочок вірша в 4 рядки.

Юнікод

Ще одна важлива тема, про яку тобі потрібно знати у зв'язку з екранування символів - Unicode (Юнікод) . Юнікод — це стандарт кодування символів, що включає знаки майже всіх письмових мов світу. Іншими словами, це список спеціальних кодів, в якому знайдеться код майже для будь-якого символу будь-якої мови! Природно, що цей список дуже великий і напам'ять його ніхто не вчить :) Якщо тобі цікаво, звідки він з'явився і навіщо став потрібен, почитай пізнавальну статтю на Хабрахабрі . Усі коди символів у Юнікоді мають вигляд “буква u+ шістнадцяткова цифра”. Наприклад, знаменитий знак копірайту позначається кодом u00A9. Так ось, якщо під час роботи з текстом у Java тобі знадобиться використовувати цей знак, ти можеш екранувати його у своєму тексті! Наприклад, ми хочемо повідомити всім, що авторські права на цю лекцію належать JavaRush:
public class Main {
   public static void main(String[] args) {
       System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
   }
}
Виведення в консоль:

Лекция "Экранирование символов", © 2018 Javarush
Чудово, все вийшло! Але спеціальні символи це ще не все! За допомогою Юнікоду та екранування символів ти можеш закодувати текст, написаний одночасно різними мовами. І навіть на кількох різних діалектах однієї мови!
public class Main {
   public static void main(String[] args) {

       System.out.println("\u041c\u0430\u0301\u043e " +
               "\u0426\u0437\u044d\u0434\u0443\u0301\u043d " +
               "\u0028\u043a\u0438\u0442\u002e \u0442\u0440\u0430\u0434\u002e " +
               "\u6bdb\u6fa4\u6771\u002c \u0443\u043f\u0440\u002e " +
               "\u6bdb\u6cfd\u4e1c\u002c \u043f\u0438\u043d\u044c\u0438\u043d\u044c\u003a " +
               "\u004d\u00e1\u006f \u005a\u00e9\u0064\u014d\u006e\u0067\u0029 " +
               "\u2014 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 " +
               "\u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 " +
               "\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 " +
               "\u0434\u0435\u044f\u0442\u0435\u043b\u044c \u0058\u0058 \u0432\u0435\u043a\u0430\u002c " +
               "\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u043a " +
               "\u043c\u0430\u043e\u0438\u0437\u043c\u0430\u002e");
   }
}
Виведення в консоль:

Ма́о Цзэду́н (кит. трад. 毛澤東, упр. 毛泽东, пиньинь: Máo Zédōng) — китайский государственный и политический деятель XX века, главный теоретик маоизма.
У цьому прикладі ми, знаючи коди символів, написали рядок, що складається з кирабоці, та трьох (!) різних типів запису китайських ієрогліфів — класичного, спрощеного та латинського (піньінь). Ось, загалом, і все! Тепер ти знаєш про екранування символів цілком достатньо, щоб використовувати цей інструмент у роботі:) Якщо не все і не до кінця зрозуміло, раджу почитати ще цю статтю : вона буде вдалим доповненням.
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.