URL encode и decode: кодирование ссылок
Пробел в ссылке — это %20, а буква «а» — %D0%B0: 6 символов вместо одного. Вставьте текст или ссылку — инструмент закодирует её для адресной строки или вернёт читаемый вид.
Инструмент
Как работает URL-кодирование
Адрес страницы может состоять только из ограниченного набора символов ASCII, поэтому всё остальное — кириллицу, пробелы, кавычки, знак «&» внутри значения — записывают байтами UTF-8 в виде «%» и двух шестнадцатеричных цифр. Слово «Москва» из шести букв превращается в 36 символов: %D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0. Обратная операция, decode, собирает байты обратно в текст.
символ → байты UTF-8 → каждый байт как %XX (шестнадцатеричная запись)
«а» = D0 B0 → %D0%B0
« » = 20 → %20 (в данных форм — «+»)
«&» = 26 → %26
Разберём вручную запрос «курс доллара». Буква «к» в UTF-8 — байты D0 BA, значит, %D0%BA; «у» — %D1%83, «р» — %D1%80, «с» — %D1%81. Пробел даёт %20, дальше «доллара» кодируется по тем же правилам: %D0%B4%D0%BE%D0%BB%D0%BB%D0%B0%D1%80%D0%B0. Итоговая строка длиннее исходной в 5,75 раза — 69 символов вместо 12, и именно её браузер отправляет на сервер, когда вы ищете курс валюты.
Инструмент показывает, сколько байтов закодировано и как изменилась длина, а при раскодировании — точную позицию ошибки, если «%» стоит без цифр или байты не складываются в UTF-8.
Какие символы кодируются
| Символ | Код | Символ | Код | Символ | Код |
|---|---|---|---|---|---|
| пробел | %20 | # | %23 | / | %2F |
< | %3C | $ | %24 | : | %3A |
| ” | %22 | % | %25 | ; | %3B |
| & | %26 | > | %3E | = | %3D |
{ | %7B | } | %7D | ? | %3F |
| + | %2B | , | %2C | @ | %40 |
| [ | %5B | ] | %5D | кириллица | %D0…, %D1… |
Буквы латиницы, цифры и знаки «-», «_», «.», «~» никогда не кодируются — это «безопасные» символы по RFC 3986. Всё, что стоит в таблице, режим encodeURIComponent заменит на код; режим encodeURI оставит символы структуры адреса (: / ? # & = + @), чтобы ссылка не сломалась.
Punycode: кириллические домены
Зона .рф работает с 2010 года, и каждый домен в ней имеет две формы: читаемую «пример.рф» и техническую xn—e1afmkfd.xn—p1ai, где каждая метка с не-латинскими символами получает префикс xn—. Свои национальные зоны есть и у соседей: .бел в Беларуси, .укр в Украине, .қаз в Казахстане — все они устроены так же. Инструмент переводит домен в обе стороны, а если вставить целую ссылку или e-mail, преобразует только доменную часть, не трогая путь, параметры и имя пользователя; список адресов можно вставить по одному на строку.
Форма punycode нужна при настройке DNS-записей, выпуске SSL-сертификата, в конфигурации почтового сервера и в поле «домен» у хостинг-провайдера. Читаемая форма — для людей: в рекламе, на визитках и в тексте писем.
Где используется URL encode
Аналитика и реклама: UTM-метки с русскими названиями кампаний (utm_campaign=весна) в Яндекс Метрике и других системах нужно кодировать, иначе часть систем обрежет значение по первому пробелу. Кнопки «Поделиться» формируют ссылки на Telegram и ВКонтакте с закодированным текстом сообщения. Разработчики кодируют значения параметров API, проверяют логи веб-серверов, где адреса всегда записаны в форме %XX, и раскодируют «нечитаемые» ссылки из писем и мессенджеров.
Вопросы и ответы
Чем encodeURIComponent отличается от encodeURI?
encodeURIComponent кодирует всё, кроме букв, цифр и знаков - _ . ! ~ * ' ( ), — его применяют к отдельному значению параметра. encodeURI оставляет нетронутыми ещё и служебные символы адреса : / ? # & = + @, поэтому подходит для ссылки целиком, но не защитит «&» внутри значения.
Почему пробел становится то %20, то плюсом?
По стандарту RFC 3986 пробел в адресе кодируется как %20. Знак «+» вместо пробела — правило формата HTML-форм application/x-www-form-urlencoded, которое действует только в строке запроса после «?». Включите флажок «Пробел как +», если готовите данные формы или разбираете такой запрос.
Что такое punycode и зачем он доменам?
Система DNS исторически понимает только латиницу, цифры и дефис, поэтому кириллические домены переводятся в ASCII по алгоритму punycode (RFC 3492): «пример.рф» превращается в xn--e1afmkfd.xn--p1ai. Браузер делает это незаметно, а в настройках DNS, сертификатах и почтовых серверах нужна именно ASCII-форма.
Почему при раскодировании появляется ошибка?
Строка содержит «%», за которым нет двух шестнадцатеричных цифр, или байты после «%» не образуют корректный UTF-8. Второе бывает со старыми ссылками в Windows-1251: «%CF%F0%E8%E2%E5%F2» — это «Привет» в кодировке 1251, и стандартная функция decodeURIComponent её не прочитает.
Нужно ли кодировать кириллицу в адресе страницы?
Браузер сделает это сам при переходе, но в HTML, sitemap, редиректах и API кириллицу лучше записывать уже закодированной: «/поиск» → «/%D0%BF%D0%BE%D0%B8%D1%81%D0%BA». Поисковые системы считают обе формы одним адресом, а вот в файлах robots.txt и .htaccess нужна форма %XX.
Источники и методика
Обновлено: