Перейти к содержимому

Кодировать URL

Закодируйте текст процентами, чтобы он пережил URL. Для трёх разных задач существуют три разные кодировки, и неверный выбор незаметно ломает значения, — поэтому страница подскажет, какая нужна вам.

  • Не сохраняется
  • Без очереди и ожидания
  • Без регистрации и водяных знаков
Закодировано

Здесь появится результат: Закодировано.

Как это работает

1

Вставьте текст

Любой текст на любом языке. Он кодируется в UTF-8 — именно этого ждёт любой современный сервер.

2

Выберите задачу

Одно значение для строки запроса, собранный URL целиком или отправка формы. Разница важна, и каждый вариант объяснён.

3

Скопируйте результат

Если нужно обработать целый список, кодируйте построчно.

Три правильных ответа — и почему одна кнопка ошибается

Percent-encoding заменяет символ на % и шестнадцатеричное значение его байта. Спецификация делит символы на три группы, и вся путаница вытекает из этого. Незарезервированные символы — буквы, цифры, дефис, точка, подчёркивание и тильда — кодировать не нужно никогда. Зарезервированные — косые черты, вопросительные знаки, амперсанды, знаки равенства и двоеточия, которые задают структуру URL, — нужно кодировать, *когда они являются данными*, и нельзя, *когда они являются структурой*. Всё остальное кодируется всегда.

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

У пробела самая богатая история. В URL это %20. В отправленной HTML-форме это + — отдельная, более старая кодировка, которая живёт потому, что формы работают так с 1994 года. Оба варианта верны в своём контексте и неверны в чужом, поэтому плюс в строке запроса неоднозначен так, что никакая аккуратность при кодировании этого не исправит.

Текст не в ASCII сначала кодируется в UTF-8, а затем побайтно, поэтому одна буква с диакритикой превращается в две процентные последовательности, а эмодзи — в четыре. Двойное кодирование — классическая ошибка: кодирование уже закодированного превращает каждый % в %25, так что %20 становится %2520, и на другом конце получают буквальный знак процента. Если URL полон %25, он прошёл через один кодировщик лишний.

Если нужно другое

В коде используйте функцию своего языка и выбирайте её так же осознанно, как заставляет эта страница. В JavaScript есть encodeURI для адресов целиком и encodeURIComponent для значений; в Python — urllib.parse.quote с аргументом safe, который по умолчанию оставляет косые черты нетронутыми; в PHP различаются rawurlencode и urlencode, и разница между ними — ровно тот самый вопрос «пробел или плюс». А ещё лучше собирать URL с помощью специального типа URL, а не склейкой строк, — тогда вопрос исчезает сам.

В командной строке jq -rR @uri кодирует безопасно и справляется со списком, а curl --data-urlencode собирает правильно закодированный параметр, не заставляя вас думать, какой из трёх случаев перед вами, — это единственное место, где всё действительно просто.

Частые вопросы

Какой из трёх вариантов выбрать?

«Одно значение» — почти всегда. Выбирайте его, когда кодируете ОДНО значение, которое пойдёт в строку запроса или сегмент пути, — поисковый запрос, адрес электронной почты, адрес для перенаправления. Только этот вариант из трёх экранирует &, =, ? и /, а именно это не даёт значению вырваться за пределы своего параметра и превратиться в два. «URL целиком» выбирайте, только когда у вас уже есть полный URL и нужно лишь очистить в нём небезопасные символы; он намеренно не трогает структурные символы, чтобы URL остался URL. «Данные формы» — когда вы собираете тело application/x-www-form-urlencoded, где пробел — это +, а не %20.

Почему мой «&» сломал URL?

Потому что его не закодировали, а & — это то, чем строка запроса отделяет один параметр от другого. Значение «Smith & Sons», добавленное как есть к ?company=, приходит на сервер как company=Smith и второй, пустой параметр с именем «Sons». Это самая распространённая ошибка в URL, и лечится она вариантом «Одно значение»: он превращает & в %26, и значение остаётся одним значением.

Почему мой «+» стал пробелом?

Потому что в строке запроса + означает пробел — это правило досталось от HTML-форм, и избавиться от него так и не удалось. Поэтому буквальный плюс в ваших данных — в номере телефона или строке Base64 — принимающий сервер читает как пробел. Вариант «Одно значение» экранирует его в %2B, и он приходит нетронутым.

Работает ли это с другими языками и эмодзи?

Да. Текст сначала переводится в UTF-8, а затем кодируется процентами побайтно — так требует RFC 3986 и этого ждёт любой современный сервер. Кириллица, японский, арабский, латиница с диакритикой и эмодзи проходят туда и обратно без искажений.

Почему здесь кодируются ! ' ( ) *, а другие инструменты их не трогают?

Потому что встроенная в браузер функция encodeURIComponent оставляет эти пять символов как есть, а RFC 3986 относит их к зарезервированным. Некоторые серверы и фреймворки трактуют их как структурные, поэтому значение с ними может быть прочитано неверно. Кодировать их безвредно — везде они декодируются обратно в точности, — а это устраняет целый класс редких и трудно диагностируемых ошибок. Так поступают аккуратные реализации.

Мой текст где-нибудь сохраняется?

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

Полезно знать: Правильных ответов три, и страница просит выбрать нужный, потому что привычная единственная кнопка «Кодировать» ошибается в двух случаях из трёх. При кодировании URL целиком, параметра запроса и сегмента пути экранируются разные символы; неверный выбор незаметно ломает косые черты, плюсы или амперсанды.

Разместите этот инструмент на своём сайте

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