Экранирование и раскодирование строк — Escape / Unescape

Экранируем текст для HTML, XML, JSON, JavaScript, URL, Base64, ячейки CSV, строки SQL и регулярного выражения — и раскодируем обратно. Замечаем двойное экранирование, сверяем результат с исходником. Текст не покидает браузер.

Что делает инструмент

Экранирование превращает служебные знаки в безопасную запись: в HTML знак «меньше» становится <, в JSON перенос строки — \n, в адресе кириллица — %D0%BA. Раскодирование возвращает всё обратно. Режим выбирается по тому, куда текст пойдёт: в разметку, в код, в адрес, в таблицу.

После каждого преобразования результат раскодируется обратно и сверяется с исходником до знака. Если не сошлось, об этом сказано прямо.

Двойное экранирование

Самая частая беда: текст уже содержит & или \n, его экранируют ещё раз, и на странице вылезает &, а в строке — \\n.

Перед экранированием мы смотрим, нет ли в тексте уже готовых последовательностей этого режима, и предупреждаем. После раскодирования проверяем, не осталось ли их: если остались, текст кодировали дважды, и нужен ещё один проход.

URL: три разных случая

Значение параметра кодируется целиком: ?, &, = и / внутри него тоже становятся процентами, иначе они разорвут адрес. Адрес целиком кодируется иначе: эти знаки остаются, превращается только то, что в адресе стоять не может.

В теле формы пробел по традиции пишется плюсом. Все три режима здесь, и при раскодировании плюс по желанию читается как пробел.

Base64 по-честному

Текст сначала переводится в байты UTF-8, потом в Base64, поэтому кириллица и значки проходят без потерь. Вариант URL-safe заменяет + и / на - и _ и убирает = в конце: такую строку можно ставить в адрес и в имя файла.

Раскодированное не всегда текст. Если байты не складываются в UTF-8, мы не показываем кракозябры, а говорим, что это: картинка PNG, документ PDF, архив ZIP — и сколько в нём байт. Приставка data: снимается сама.

Режимы

  • HTML: пять служебных знаков, а раскодирование понимает все именованные сущности, включая   и —;
  • XML: только пять сущностей,   здесь нет;
  • JSON и JavaScript: содержимое строкового литерала, кавычки по желанию, не-ASCII по желанию как \u0430;
  • ячейка CSV: кавычки вокруг, если внутри разделитель, кавычка или перенос строки, кавычка внутри удваивается;
  • строка SQL: апостроф удваивается. Это не замена параметрам запроса: от подстановки значений в текст лучше уходить вовсе;
  • регулярное выражение: точка, скобки, звёздочка и прочие служебные знаки получают обратную косую черту.

Текст остаётся в браузере

Экранируют и токены, и пароли, и куски чужих писем. На сервер ничего не уходит: преобразование и сверка считаются на вашей стороне.

Другие инструменты