Кодировать URL
Закодируйте текст процентами, чтобы он пережил URL. Для трёх разных задач существуют три разные кодировки, и неверный выбор незаметно ломает значения, — поэтому страница подскажет, какая нужна вам.
- Не сохраняется
- Без очереди и ожидания
- Без регистрации и водяных знаков
Здесь появится результат: Закодировано.
Как это работает
Вставьте текст
Любой текст на любом языке. Он кодируется в UTF-8 — именно этого ждёт любой современный сервер.
Выберите задачу
Одно значение для строки запроса, собранный URL целиком или отправка формы. Разница важна, и каждый вариант объяснён.
Скопируйте результат
Если нужно обработать целый список, кодируйте построчно.
Три правильных ответа — и почему одна кнопка ошибается
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 целиком, параметра запроса и сегмента пути экранируются разные символы; неверный выбор незаметно ломает косые черты, плюсы или амперсанды.
Разместите этот инструмент на своём сайте
Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.