URL кодирование и декодирование строк

Кодирование URL и просто двоичных данных в последовательность букв, цифр и некоторых специальных знаков латинского алфавита в интернете было связано с ограничением физических устройств на передачу только алфавитно-цифровых символов. В URL такое кодирование обычно применяется для передачи символов в формате Unicode (как правило UTF-8) в последовательность из двух байт, записанных в шестнадцатиричном представлении. Каждый байт предваряется знаком %. При таком кодировании строчка «корова» будет иметь вид: %D0%BA%D0%BE%D1%80%D0%BE%D0%B2%D0%B0 . То есть русской букве к будет соответствовать последовательность %D0%BA и.т.д. Такое кодирование является общепринятым для путей к файлам или папкам, входящим в URL.
Подмножесто символов, которые разрешены в URL немного шире чем алфавитно-цифровые символы, так, в URL можно использовать дефис и подчеркивание, но нельзя, например, использовать одинарные или двойные кавычки. Некоторые символы используют для разделения параметров в URL, и их кодирование в этом случае будет неправомочным. В зависимости от отношения к кодированию специальных символов в javascript различают функции encodeURI и decodeURI, которые могут работать с полным URL, и, функции encodeURIComponent / decodeURIComponent, применяемые для параметров, входящих в URL.
Вообще говоря, кодирование параметров может быть достаточно произвольным. Здесь разработчик может использовать любую схему кодировки, если состав ее символов будет коректно передаваться через сеть. Так, вместо строки кириллицы в utf-8 можно применить строку в кодировке Windows 1251. В этом случае слово «корова» будет выглядеть как %EA%EE%F0%EE%E2%E0. То есть, символу к будет соответствовать последовательность из двух букв со знаком процента перед ними — %EA. Закодировать в строки с процентами кириллицу из других кодировок можно в нашем HTML кодировщике. В принципе, допустимы также другие способы кодирования, например, escape/unescape функцию javascript. Слово «корова» в этом случае будет выглядеть как %u043A%u043E%u0440%u043E%u0432%u0430 .
Экранирование пробельных символов в строке
Где-то в недрах Utils.buildQueryParams каждый параметр, помещаемый в итоговую строку, проходит следующую процедуру:
function encodeQueryItem(item) < let escaped = item; if (typeof escaped === 'string') < escaped = JSON.stringify(escaped); escaped = escaped.substring(1, escaped.length - 1); >return encodeURIComponent(escaped); >
Всё у меня работает как надо, но мне не нравится то, как выглядит encodeQueryItem . Можно ли как-то более элегантно это сделать? Раз пошли вопросы «зачем», значит я поясню: Если у меня строка вида a\nb , где \n это символ перевода строки, тогда на сервер уйдёт такая строка: ‘description=a%0Ab’ , и в этом же виде(после URL decode) там будет сохранена. Потом, когда я его попрошу вернуть мне эту строку, он с радостью положит её в JSON, и JSON парсер сломается, потому что все пробельные символы в строке должны быть экранированы. Хотя это и не важно, приведу код и buildQueryParams :
function buildQueryParams(jsObject) < return Object.keys(jsObject) .map((name) =>`$=$`) .join('&'); >
Отслеживать
задан 16 янв 2017 в 11:38
23.8k 3 3 золотых знака 47 47 серебряных знаков 61 61 бронзовый знак
Сам формат — это какой-то костыль. Не надо одновременно два разных экранирования,когда вполне хватает второго.
16 янв 2017 в 11:52
Не хватает. Формат должен быть такой как есть. Не ответ на вопрос.
16 янв 2017 в 11:52
а я что-то не пойму, зачем мы строке еще раз stringify делаем и судя по всему кавычки обрезаем
16 янв 2017 в 11:53
@Grundy, экранирует пробельные символы(\n, \t и т.д)
16 янв 2017 в 11:53
@ixSci, но они и через encodeURIComponent умеют экранироваться.
16 янв 2017 в 11:55
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вам правильно не нравится как выглядит encodeQueryItem. Потому что encodeURIComponent принимает на вход только строки — а значит, условный оператор тут определенно лишний.
Если задача заключается в том, чтобы закодировать строку так, чтобы сервер не смог ее раскодировать — самым красивым способом будет применить encodeURIComponent дважды:
function encodeQueryItem(item)
Результат encodeURIComponent является «JSON-безопасным», так что проблем с ним не будет. Только надо будет не забыть раскодировать строку обратно на клиенте.
Достоинство этого способа — он не поломается когда сервер все-таки починят.
Если же требуется, чтобы сервер выдавал правильно экранированный JSON при неверной реализации — то вы выбрали правильный вариант.
Только проверка типа лишняя, ну и лучше использовать slice как указал lexxl:
function encodeQueryItem(item)
Надо помнить, что этот вариант поломается как только сервер починят и будет требовать в дальнейшем довольно странной процедуры декодирования, которой исходно и пытались избежать. А рано или поздно его таки починят, потому что это уязвимость.
Если же функция может принимать разные типы — надо не забыть, что сервер в любом случае все превратит в строку, а значит — обратного декодирования на клиенте не избежать. Ну и зачем тогда стараться? Просто превращаем все в строку с сохранением типа через stringify — а потом кодируем строку как сделано выше.
Отсутствие отдельной обработки для строк заметно упростит логику декодировщика, который все равно будет.
function encodeQueryItemObject(item)
PS вот потому мне и нравится работать фулстеком что можно чинить где поломалось, а не где разрешено 🙂
Экранирование (или что нужно знать для работы с текстом в тексте)
SQL инъекции, подделка межсайтовых запросов, поврежденный XML… Страшные, страшные вещи, от которых мы все бы хотели защититься, да вот только знать бы почему это все происходит. Эта статья объясняет фундаментальное понятие, стоящее за всем этим: строки и обработка строк внутри строк.
Основная проблема
Это всего лишь текст. Да, просто текст — вот она основная проблема. Практически все в компьютерной системе представлено текстом (который, в свою очередь, представлен байтами). Разве что одни тексты предназначены для компьютера, а другие — для людей. Но и те, и те, всё же остаются текстом. Чтобы понять, о чем я говорю, приведу небольшой пример:
Homo Sapiens Suppose, there is the English text, which I don't wanna translate into Russian
Не поверите: это — текст. Некоторые люди называют его XML, но это — просто текст. Возможно, он не подойдет для показа учителю английского языка, но это — всё еще просто текст. Вы можете распечатать его на плакате и ходить с ним на митинги, вы можете написать его в письме своей маме… это — текст.
Тем не менее, мы хотим, чтобы определенные части этого текста имели какое-то значение для нашего компьютера. Мы хотим, чтобы компьютер был в состоянии извлечь автора текста и сам текст отдельно, чтобы с ним можно было что-то сделать. Например, преобразовать вышеупомянутое в это:
Suppose, there is the English text, which I don't wanna translate into Russian by Homo Sapiens
Откуда компьютер знает, как сделать это? Ну, потому что мы весьма кстати обернули определенные части текста специальными словами в забавных скобках, как, например,
Иными словами, мы использовали определенные правила в нашем тексте, чтобы обозначить некое особое значение, которое кто-то, соблюдая те же правила, мог бы использовать.
Ладно, это всё не так уж и трудно понять. А что если мы хотим использовать эти забавные скобки, имеющие какое-то особое значение, в нашем тексте, но без использования этого самого значения. Примерно так:
Homo Sapiens Basic math tells us that if x < n and y >n, x cannot be larger than y.
Символы «» не являются ничем особенным. Они могут законно использоваться где угодно, в любом тексте, как в примере выше. Но как же наша идея о специальных словах, типа ? Значит ли это, что » < n and y >» тоже является каким-то ключевым словом? В XML — возможно да. А возможно нет. Это неоднозначно. Поскольку компьютеры не очень справляются с неоднозначностями, то что-то в итоге может дать непредвиденный результат, если мы не расставим сами все точки над i и не устраним неоднозначности.
Решить эту дилемму можно, заменив неоднозначные символы чем-то однозначным.
Homo Sapiens Basic math tells us that if x < n and y > n, x cannot be larger than y.
Теперь, текст должен стать полностью однозначным. «<» равносильно «».
Техническое определение этого — экранирование, мы избегаем специальные символы, когда не хотим, чтобы они имели свое особое значение.
escape |iˈskāp| [ no obj. ] вырваться на свободу [ with obj. ] не заметить / не вспомнить [. ] [ with obj. ] IT: причина быть интерпретированным по-разному [. ]
Если определенные символы или последовательности символов в тексте имеют особое значение, то должны быть правила, определяющие, как разрешить ситуации, когда эти символы должны использоваться без привлечения своего особого значения. Или, другими словами, экранирование отвечает на вопрос: «Если эти символы такие особенные, то как мне их использовать в своем тексте?».
Как можно было заметить в примере выше, амперсанд (&) — это тоже специальный символ. Но что делать, если мы хотим написать «<«, но без интерпретации этого как »
Другие примеры
XML — не единственный случай «страдания» от специальных символов. Любой исходный код, в любом языке программирования может это продемонстрировать:
var name = "Homo Sapiens"; var contents = "Suppose, there is the English text, which I don't wanna translate into Russian";
Всё просто — обычный текст четко отделяется от «не текста» двойными кавычками. Таким же образом можно использовать и мой текст из курса математического анализа:
var name = "Homo Sapiens"; var contents ;
Клево! И даже не нужно прибегать к экранированию! Но, подождите, а что, если я хочу процитировать кого-нибудь?
var name = "Homo Sapiens"; var contents = "Plato is said to once have said "Lorem ipsum dolor sit amet".";
Хм… печаль, тоска. Как человек, Вы можете определить где начинается и заканчивается текст и где находится цитата. Однако это снова стало неоднозначным для любого компьютера. Мы должны придумать какие-то правила экранирования, которые помогали бы нам различить буквальный » и «, который означает конец текста. Большинство языков программирование используют косую черту:
var name = "Homo Sapiens"; var contents = "Plato is said to once have said \"Lorem ipsum dolor sit amet\".";
«\» делает символ после него не специальным. Но это, опять-таки, значит, что «\» — специальный символ. Для однозначного написания этого символа в тексте, к нему нужно добавить такой же символ, написав: «\\». Забавно, не так ли?
Атака!
Не всё было бы так плохо, если бы просто должны были прибегать к экранированию. Напрягает конечно, но это не так ужасно. Проблемы начинаются, когда одни программы пишут текст для других программ, чтобы те могли его «читать». И нет, это не научная фантастика, это происходит постоянно. Например, на этом сайте, вы, публикуя сообщение, не набираете его в ручную в формате HTML, а пишите лишь только текст, который, в последствие, преобразуется этим сайтом в HTML, после чего, уже браузер, преобразует «сгенерированный» HTML снова в читабельный текст.
Другой распространенный пример и источник многих проблем безопасности — SQL запросы. SQL — язык, предназначенный для упрощения общения с базами данных:
SELECT phone_number FROM users WHERE name = 'Alex'
В этом тексте практически нет никаких специальных символов, в основном английские слова. И все же, фактически у каждого слова в SQL есть особое значение. Это используется во многих языках программирования во всем мире в той или иной форме, например:
$query = "SELECT phone_number FROM users WHERE name = 'Alex'"; $result = mysql_query($query);
Эти две простые строки абстрагируют от нас ужасно сложную задачу запроса программой у БД данных, удовлетворяющих нашим требованиям. БД «просеивает», возможно, терабайты битов и байтов, чтобы вернуть красиво отформатированный результат программе, сделавшей запрос. Серьезно, вся эта хрень инкапсулирована в простом англо-подобном предложении.
Для того, чтобы сделать это полезным, подобные запросы не хард-кодятся, а строятся на основе пользовательского ввода. Это же предложение, направленное на использование разными пользователями:
$name = $_POST['name']; $query = "SELECT phone_number FROM users WHERE name = '$name'"; $result = mysql_query($query);
В случае, если Вы просто просматриваете эту статью: Это — анти-пример! Это худшее, что Вы когда-либо могли сделать! Это кошмар безопасности! Каждый раз, когда Вы будете писать что-то подобное, будет погибать один невинный котенок! Ктулху сожрет Вашу душу за это!
А теперь давайте посмотрим, что здесь происходит. $_POST[‘name’] — значение, которое некий случайный пользователь ввел в некую случайную форму на вашем случайно веб-сайте. Ваша программа построит SQL-запрос, использующий это значение в качестве имени пользователя, которого Вы хотели бы найти в БД. Затем это SQL «предложение» отправляется прямиком в БД.
Вроде бы звучит все не так ужасно, да? Давайте попробуем ввести несколько случайных значений, которые можно ввести на вашем случайном веб-сайте и какие запросы из этого получатся:
SELECT phone_number FROM users WHERE name = 'Alex'
Mc’Donalds
SELECT phone_number FROM users WHERE name = 'Mc'Donalds'
Joe’; DROP TABLE users; —
SELECT phone_number FROM users WHERE name = 'Joe'; DROP TABLE users; --'
Первый запрос выглядит не страшно, а вполне себе мило, правда? Номер 2, кажется, «несколько» повреждает наш синтаксис из-за неоднозначного ‘. Чертов немец! Номер 4 какой-то дурацкий. Кто бы такое написал? Это ведь не имеет смысла…
Но не для БД, обрабатывающей запрос… БД понятия не имеет от куда этот запрос поступил, и что он должен значить. Единственное, что она видит — это два запроса: найти номер пользователя по имени Joe, а затем удалить таблицу users (что сопровождается комментарием ‘), и это будет успешно сделано.
Для вас это не должно быть новостью. Если это так, то, пожалуйста, прочитайте эту статью еще раз, ибо Вы либо новичок в программировании, либо последние 10 лет жили в пещере. Этот пример иллюстрирует основы SQL-инъекций, применяемых во всем мире. для того, чтобы удалить данные, или получить данные, которые не должны быть просто так получены, или войти в систему, не имея на то прав и т.д. А все потому, что БД воспринимает англо-подобный «приговор» слишком буквально.
Впереееееед!
Следующий шаг: XSS атаки. Действуют они аналогично, только применяются к HTML.
Допустим, Вы решили проблемы с БД, получаете данные от пользователя, записываете в базу и выводите их назад на веб-сайт, для доступа пользователям. Это то, что делает типичный форум, система комментариев и т.д. Где-то на вашем сайте есть что-то подобное:
Posted by on
Если ваши пользователи будут хорошими и добрыми, то они будут размещать цитаты старых философов, а сообщения будут иметь примерно следующий вид:
Posted by Plato on January 2, 15:31
I am said to have said "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."
Если пользователи будут умниками, то они, наверное, будут говорить о математике, и сообщения будут такие:
Posted by Pascal on November 23, 04:12
Basic math tells us that if x < n and y >n, x cannot be larger than y.
Хм… Опять эти осквернители наших скобок. Ну, с технической точки зрения они могут быть неоднозначными, но браузер простит нам это, правда?
Posted by JackTR on July 18, 12:56
Хорошо, СТОП, что за черт? Какой-то шутник ввел javascript теги на ваш форум? Любой, кто смотрит на это сообщение на вашем сайте, сейчас загружает и выполняет скрипты в контексте вашего сайта, которые могут сделать не весть что. А это не есть хорошо.
Не следует понимать буквально
В вышеупомянутых случаях, мы хотим каким-то образом сообщить нашей БД или браузеру, что это просто текст, ты с ним ничего не делай! Другими словами, мы хотим «удалить» особые значения всех специальных символов и ключевых слов из любой информации, предоставленной пользователем, ибо мы ему не доверяем. Что же делать?
Что? Что говоришь, мальчишка? Ах, ты говоришь, «экранирование»? И ты абсолютно прав, возьми печеньку!
Если мы применим экранирование к пользовательским данным до объединения их с запросом, то проблема решена. Для наших запросов к БД это будет что-то вроде:
$name = $_POST['name']; $name = mysql_real_escape_string($name); $query = "SELECT phone_number FROM users WHERE name = '$name'"; $result = mysql_query($query);
Просто одна строка кода, но теперь больше никто не может «взломать» нашу базу данных. Давайте снова посмотрим как будут выглядеть SQL-запросы, в зависимости от ввода пользователя:
Alex
SELECT phone_number FROM users WHERE name = 'Alex'
Mc’Donalds
SELECT phone_number FROM users WHERE name = 'Mc\'Donalds'
Joe’; DROP TABLE users; —
SELECT phone_number FROM users WHERE name = 'Joe\'; DROP TABLE users; --'
mysql_real_escape_string без разбора помещает косую черту перед всем, у чего может быть какое-то особое значение.
Далее, заменим наш скрипт на форуме:
Posted by on
Мы применяем функцию htmlspecialchars ко всем пользовательским данным, прежде, чем вывести их. Теперь сообщение вредителя выглядит так:
Posted by JackTR on July 18, 12:56
<script src="http://evil.com/dangerous.js" type="text/javascript" charset="utf-8"></script>
Обратите внимание, что значения, полученные от пользователи, на самом деле не «повреждены». Любой браузер парсит этот как HTML и выведет на экран все в правильной форме.
Что возвращает нас к.
Все вышеупомянутое демонстрирует проблему, характерную для многих систем: текст в тексте должно быть подвергнут экранированию, если предполагается, что он не должен иметь специальных символов. Помещая текстовые значения в SQL, они должны быть экранированы по правилам SQL. Помещая текстовые значения в HTML, они должны быть экранированы по правилам HTML. Помещая текстовые значения в (название технологии), они должны быть экранированы по правилам (название технологии). Вот и все.
Для полноты картины
- Validation
Вы можете проверить, соответствует ли пользовательский ввод некоторой заданной спецификации. Если Вы требуете ввода числа, а пользователь вводит нечто другое, программа должна сообщить ему об этом и отменить ввод. Если все это правильно организовать, то нет никакого риска схватить «DROP TABLE users» там, где, предполагалось, пользователь введет «42». Это не очень практично, для избегания HTML/SQL-инъекций, т.к. часто требуется принять текст свободного формата, который может содержать «подковырки». Обычно валидацию используют в дополнение к другим мерам. - Sanitization
Вы можете так же «втихую» удалить любые символы, которые считаете опасными. Например, просто удалить что-либо похожее на HTML-тег, что избежать добавления на ваш форум. Проблема в том, что вы можете удалить вполне законные части текста.
Prepared SQL statements
Есть специальные функции, делающие то, чего мы и добивались: заставляют БД понять различия между самим SQL-запросом и информацией, предоставленной пользователями. В РНР они выглядят примерно так:
$stmt = $pdo->prepare('SELECT phone_number FROM users WHERE name = ?'); $stmt->execute($_POST['name']);
При этом отправка происходит в два этапа, четко разграничивая запрос и переменные. БД имеет возможность сначала понять структуру запроса, а потом заполнить его значениями.
Экранирование символов в Java


Что-то пошло не так! Данная статья писалась как выполнение тестового задания на должность в команде 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"); // На экране отображается 2 + 2 = 5 System.out.print("\b");// На экране отображается 2 + 2 = System.out.print("4");// На экране отображается 2 + 2 = 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-последовательность переноса строки"); // Вывод: \n - escape-последовательность переноса строки
На практике же экранировать обратный слеш чаще приходится при работе с путями:
System.out.println("It's Java string: \"C:\\Program Files\\Java\\jdk1.7.0\\bin\""); // Вывод: 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); // Процент жирности молока : 10%
На этом статья подходит концу. Надеюсь, вы узнали много нового об экранировании символов, и о том, как применять это на практике. Экранирование символов присуще многим языкам программирования. В java, как и в других си-подобных языках данная технология реализована почти одинаково. Поэтому, полученные вами знания из этой статьи вполне могут пригодится не только в java. Спасибо за внимание и удачи в обучении!