Кодирование и декодирование URL

Percent-encode текста для URL или декодируйте последовательности %HH обратно в символы. Сравните режим компонента с полным URI и поймите, почему %20 и + не одно и то же.

Все расчёты выполняются в браузере. Ничего из введённого не отправляется на сервер.

01 калькулятор

Результаты обновляются при вводе. Ctrl/Cmd+Enter копирует основной результат.

Результат

    Показать решение

      Кодирование и декодирование URL применяет percent-encoding RFC 3986 к тексту и обращает последовательности %HH обратно в символы. Режим компонента кодирует зарезервированные символы вроде /, ? и &, чтобы они могли безопасно сидеть внутри одного параметра запроса. Режим полного URI сохраняет структурные разделители, чтобы полный адрес оставался рабочей ссылкой. Обработка пробелов предлагает и %20, и плюс формы.

      Всё кодирование и декодирование выполняется в браузере. Ничего из вставленного не отправляется на сервер.

      Кодирование текста для безопасного использования в URL

      Concept diagram: Входы leads to Кодирование текста для безопасного использования в URL leads to РезультатВходыКодирование текста длябезопасногоиспользования в URLРезультат
      Кодирование текста для безопасного использования в URL.

      Percent-encoding заменяет небезопасные или зарезервированные байты знаком процента, за которым следуют две шестнадцатеричные цифры. Цифры это значение байта, обычно из UTF-8. Введите строку, выберите режим компонента или полного URI и скопируйте закодированный результат в query string, сегмент пути или цель редиректа.

      Символы, уже входящие в незарезервированный набор, проходят без изменений. Всё остальное в режиме компонента становится последовательностями %HH. Кодирование обратимо, когда на декодировании те же правила; смешение плюса form-encoding с %20 в стиле пути это обычный источник сломанных циклов.

      Декодирование percent-encoded строки

      Scale bar: 1 Входная единица equals 1.8 Выходная единица1 Входная единица1.8 Выходная единица
      Декодирование percent-encoded строки.

      Декодирование находит каждый %, за которым следуют две hex-цифры, переводит эту пару в байт и восстанавливает исходный текст с выбранной кодировкой символов. Один % или % с не-hex цифрами это ошибка. Плюсы можно опционально трактовать как пробелы, когда ввод пришёл из тел application/x-www-form-urlencoded.

      Вложенное кодирование появляется, когда значение кодировали дважды. Одно декодирование может оставить последовательности %25, представляющие буквальный процент. Декодируйте снова только когда второй слой был намеренным; слепое двойное декодирование портит данные, содержавшие настоящий символ %.

      Зарезервированные и незарезервированные символы

      Concept diagram: Входы leads to зарезервированные и незарезервированные символы leads to РезультатВходызарезервированные инезарезервированныесимволыРезультат
      Зарезервированные и незарезервированные символы.

      RFC 3986 делит ASCII на незарезервированные символы, которым никогда не нужно кодирование в URI, и зарезервированные символы, несущие структурный смысл вроде разделителей. Незарезервированные буквы, цифры и -_.~ остаются буквальными. Зарезервированные знаки вроде /, ? и & должны быть percent-encoded, когда они появляются как данные, а не как синтаксис, обрамляющий URL.

      Незарезервированные: A-Z, a-z, 0-9, дефис -, подчёркивание _, точка ., тильда ~

      Зарезервированные (gen-delims): `: / ?

      Зарезервированные (sub-delims): ! $ & ' ( ) * + , ; =

      Незарезервированные символы остаются буквальными. Зарезервированные должны кодироваться, когда они данные, а не разделители. Вопросительный знак внутри значения параметра это данные; вопросительный знак, начинающий query string, это структура. Выбор режима это то, как калькулятор знает, какую роль играет каждый символ.

      Кодирование целого URL и одного параметра

      Comparison chart of Вариант A versus Вариант B across Case 1, Case 2, Case 3Case 1Case 2Case 3Вариант AВариант B
      Кодирование целого URL и одного параметра.

      Кодирование полного URI, похожее на JavaScript encodeURI, оставляет структурные символы нетронутыми, чтобы https:// и слэши пути сохранились. Кодирование компонента, похожее на encodeURIComponent, кодирует эти символы, чтобы значение могло сидеть внутри параметра, не ломая окружающий URL. Неверный режим либо уничтожает ссылку, либо оставляет разделители, которые неправильно делят query.

      ВводСтиль полного URIСтиль компонента
      https://example.com/a bhttps://example.com/a%20bhttps%3A%2F%2Fexample.com%2Fa%20b
      red&bluered&bluered%26blue
      a=ba=ba%3Db

      Кодирование всего URL режимом компонента уничтожает его как ссылку: двоеточие схемы и слэши становятся %3A и %2F. Кодирование одного параметра режимом полного URI оставляет & и = нетронутыми, что неправильно делит query. Выберите режим под слот, который займёт строка.

      Кодирование слэша и вопросительного знака

      Concept diagram: Входы leads to Кодирование слэша и вопросительного знака leads to РезультатВходыКодирование слэша ивопросительного знакаРезультат
      Кодирование слэша и вопросительного знака.

      Тестовая строка / and ? в режиме компонента становится %2F%20and%20%3F. Слэш и вопросительный знак это зарезервированные разделители, здесь трактуемые как текст данных, поэтому каждый экранируется. Пробелы становятся %20, буквы в and незарезервированы и проходят без изменений слева направо по строке.

      СимволПричинаЗакодировано
      /зарезервированный разделитель пути%2F
      пробелне незарезервированный%20
      a, n, dнезарезервированные буквыбез изменений
      ?зарезервированный разделитель query%3F

      Пройдите строку слева направо: закодируйте /, закодируйте пробел, пропустите and, закодируйте пробел, закодируйте ?. Результат %2F%20and%20%3F безопасен для размещения в параметре запроса, например q. Режим полного URI на той же строке оставил бы / и ? буквальными, что верно только когда эти символы задуманы как структура, а не как текст данных.

      %20 и знак плюс

      Comparison chart of Вариант A versus Вариант B across Case 1, Case 2, Case 3Case 1Case 2Case 3Вариант AВариант B
      %20 и знак плюс.

      Пробел кодируется как %20 в путях URI и в современных query strings по RFC 3986. HTML-формы, отправляющиеся как application/x-www-form-urlencoded, исторически кодируют пробелы как +. Обе конвенции встречаются в продакшене, и трактовка их как идентичных это самая частая ошибка пробелов при декодировании смешанных входов.

      КонтекстКодирование пробела
      Сегмент пути%20
      Query по RFC 3986%20
      Тело формы / legacy query+

      Буквальный плюс в данных должен кодироваться как %2B, иначе form-декодер превратит его в пробел. Калькулятор помечает, какая конвенция пробелов активна, чтобы декодированный + не приняли за символ плюс при включённом form-режиме, а %20 не отклонили при path-режиме.

      Разбор URL на части

      Concept diagram: Входы leads to Разбор URL на части leads to РезультатВходыРазбор URL на частиРезультат
      Разбор URL на части.

      Типичный URL имеет схему, хост, необязательный порт, путь, query string и fragment; правила кодирования различаются по частям. Структурные разделители вроде ://, /, ?, &, = и # остаются буквальными, когда они обрамляют адрес.

      Имена параметров, значения параметров и сегменты пути с данными кодируются по отдельности в режиме компонента, прежде чем эти разделители их соединят.

      https://example.com:443/search?q=a%20b&lang=en#top
      └─┬─┘   └─────┬─────┘ └─┬──┘ └───────┬───────┘ └┬┘
      схема       хост     путь        query      fragment
      ЧастьРоль
      СхемаПротокол, например https
      ХостДомен или IP, с необязательным портом
      ПутьРасположение ресурса, через слэши
      QueryСписок параметров после ?, через &
      FragmentКлиентская якорная часть после #, не отправляется на сервер в request URI так же

      Кодируйте имена и значения параметров по отдельности в режиме компонента, затем соединяйте буквальными & и =. Кодируйте сегменты пути по отдельности, если они содержат пробелы или зарезервированные символы, сохраняя слэши между сегментами буквальными.

      Таблица кодирования символов

      Concept diagram: Входы leads to таблица кодирования символов leads to РезультатВходытаблица кодированиясимволовРезультат
      Таблица кодирования символов.

      Таблица ниже перечисляет распространённые зарезервированные и небезопасные символы с их percent-формами при UTF-8 кодировании байтов. Пробел становится %20, амперсанд %26, решётка %23. Не-ASCII символы разворачиваются в несколько единиц %HH, потому что каждый байт UTF-8 кодируется отдельно, а не как один абстрактный глиф.

      СимволPercentПримечания
      пробел%20Или + в form-encoding
      !%21
      #%23Разделитель fragment
      $%24
      &%26Разделитель пар query
      '%27
      (%28
      )%29
      +%2BБуквальный плюс
      ,%2C
      /%2FРазделитель пути
      :%3AРазделитель схемы / хоста
      ;%3B
      =%3DПрисвоение параметра
      ?%3FНачало query
      @%40Разделитель userinfo
      [%5B
      ]%5D

      Не-ASCII текст сначала выражается как байты UTF-8, затем каждый байт percent-encoded. Один видимый символ поэтому может развернуться в две или три единицы %HH. Подробности legacy charset вроде Shift JIS живут у инструмента Base64; эта страница ссылается, а не повторяет тот каталог.

      Часто задаваемые вопросы

      Что такое percent-encoding?

      Percent-encoding заменяет байт на %, за которым следуют две шестнадцатеричные цифры значения этого байта. Это позволяет зарезервированным и не-ASCII символам путешествовать внутри URL, не читаясь как синтаксис. Декодирование обращает подстановку.

      Когда использовать кодирование компонента?

      Используйте кодирование компонента для одного имени или значения параметра, сегмента пути как чистых данных или любой строки, которую вставят рядом со структурными разделителями. Оно кодирует /, ?, & и =, чтобы они не могли разделить URL.

      Когда использовать кодирование полного URI?

      Используйте кодирование полного URI, когда ввод уже полный URL и должны измениться только недопустимые символы вроде пробелов. Структурные двоеточия и слэши остаются буквальными, чтобы результат оставался кликабельным адресом.

      Почему / and ? становится %2F%20and%20%3F?

      В режиме компонента слэш и вопросительный знак трактуются как данные, поэтому кодируются в %2F и %3F. Пробелы становятся %20. Буквы в and незарезервированы и остаются как есть.

      Плюс это то же самое, что %20?

      Нет. %20 это кодирование пробела по RFC 3986. + означает пробел только в данных application/x-www-form-urlencoded. Буквальный плюс должен быть %2B, иначе form-декодеры превратят его в пробел.

      Какие символы никогда не нужно кодировать?

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

      Как кодируются не-ASCII символы?

      Сначала они переводятся в байты UTF-8, затем каждый байт percent-encoded. Один видимый символ может стать несколькими последовательностями %HH. Декодирование должно использовать UTF-8 для восстановления исходного текста.

      Исправит ли двойное декодирование сломанный URL?

      Только если значение намеренно кодировали дважды. Иначе второй проход портит буквальные последовательности %, бывшие частью данных. Декодируйте один раз, осмотрите, и декодируйте снова только когда паттерны %25 показывают второй слой.

      Это то же самое, что Base64?

      Нет. Percent-encoding экранирует символы для URI. Base64 отображает произвольные байты на 64-символьный алфавит для транспорта в текстовых протоколах. Используйте каждый для своей задачи.

      Загружаются ли вставленные URL?

      Нет. Кодирование и декодирование выполняются только в браузере. Query strings с токенами или фрагментами сессии не передаются на сервер этим инструментом.

      Итог

      Кодирование и декодирование URL percent-encode и декодирует текст по правилам RFC 3986, с отдельными режимами для полных URI и отдельных компонентов. Тестовый fixture / and ? становится %2F%20and%20%3F в режиме компонента. Пробелы используют %20 в контекстах URI и могут использовать + в form-encoding, это другая конвенция.

      Зарезервированные символы сохраняют смысл только когда оставлены буквальными как структура; кодируйте их, когда они данные. Вся работа остаётся на устройстве.