Все статьи

String Escape: почему один и тот же текст нужно экранировать по-разному

Опция «экранировать не-ASCII как \uXXXX» особенно полезна для кириллицы: она превращает «Привет» в Привет — последовательность, состоящую только из ASCII-символов. Исторически это было не просто удобством, а обходом реальной проблемы: старые системы и неправильно настроенные каналы передачи данных нередко ожидали кодировку Windows-1251 вместо UTF-8, и кириллица, вставленная «как есть», превращалась в нечитаемую кашу (мойбаке). Экранирование в \uXXXX полностью убирает зависимость от того, в какой кодировке текст будет прочитан на другом конце.

Экранирование в строке JavaScript/JSON

В строковых литералах JS и в JSON спецсимволы экранируют обратным слешем: \" для кавычки, \n для переноса строки, \\ для самого обратного слеша. JSON дополнительно требует, чтобы все строки были в двойных кавычках — в отличие от JS, где допустимы и одинарные.

Экранирование в shell-командах

В командной строке спецсимволами являются пробел, кавычки, знак доллара, звёздочка и другие — они имеют особое значение для оболочки (shell). Пробел в аргументе команды нужно экранировать или взять весь аргумент в кавычки, иначе оболочка разделит его на два отдельных аргумента.

Экранирование в регулярных выражениях

В регулярных выражениях символы вроде точки, звёздочки или круглых скобок имеют специальное значение (любой символ, квантификатор, группа). Чтобы найти их буквально, а не как метасимволы, перед ними ставят обратный слеш: \. находит точку, а не «любой символ».

Зачем нужно отдельное экранирование для каждого контекста

Ошибка «двойного экранирования» или «недостаточного экранирования» — одна из самых частых причин сломанного кода при вставке текста пользователя (например, пути к файлу с пробелом) в команду или строку. Правильное экранирование зависит от того, куда именно вставляется текст, а не от самого текста.

Зачем это нужно

  • Подготовить текст пользователя, включая кириллицу, для безопасной вставки в JSON-запрос.
  • Сформировать shell-команду с динамическим аргументом без риска инъекции команд.
  • Экранировать спецсимволы перед использованием текста как буквального паттерна в регулярном выражении.

Двойное экранирование во вложенных контекстах

Если текст проходит через два контекста последовательно — например, строка вставляется в JSON, а этот JSON передаётся как аргумент shell-команды — экранировать нужно в правильном порядке: сначала для внутреннего контекста (JSON), затем для внешнего (shell). Перепутанный порядок или пропущенный один из уровней — типичная причина, почему «правильно экранированная» строка всё равно ломается на практике.

Попробовать инструмент