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

URL encode и decode: кодирование ссылок

Пробел в ссылке — это %20, а буква «а» — %D0%B0: 6 символов вместо одного. Вставьте текст или ссылку — инструмент закодирует её для адресной строки или вернёт читаемый вид.

Инструмент

Операция
  • РежимencodeURIComponent — значение параметра
  • Закодировано байтов39
  • Длина до → после44 → 138 символов
  • Байт UTF-8 до → после60 → 138
URL encode и decode онлайн — кодирование ссылок, punycode
Процентное кодирование ссылок: encodeURIComponent, encodeURI, decode, «+» как пробел, punycode

Как работает 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

Процентное кодирование (RFC 3986)

Разберём вручную запрос «курс доллара». Буква «к» в 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.

Источники и методика

Обновлено: