Ссылку с кириллическим текстом — товар на Wildberries, пост во «ВКонтакте», статья в поиске — нельзя вставить в адресную строку «как есть»: пробелы, &, ? и сами кириллические буквы должны быть закодированы в percent-encoding, иначе сервер прочитает адрес неправильно или вовсе оборвёт его.
Почему кириллица «весит» в шесть раз больше
Каждая русская буква сначала превращается в 2 байта UTF-8, а затем каждый байт записывается как %XX — то есть одна буква «я» становится %D1%8F, шесть символов вместо одного. Поисковый запрос «купить диван» в query-строке легко превращается в полсотни символов percent-encoding, из-за чего ссылки, скопированные из адресной строки для отправки в мессенджер, выглядят пугающе длинными.
encodeURIComponent и encodeURI — не одно и то же
encodeURIComponent кодирует вообще все спецсимволы, включая &, ?, = и /, поэтому годится только для одного значения параметра — например, поискового запроса, который потом подставляется в ?q=. encodeURI сохраняет структурные символы адреса и предназначена для кодирования уже собранного URL целиком, с путём и query-строкой.
Частая ошибка с UTM-метками
Если рекламная ссылка с параметрами utm_source, utm_campaign и кириллическим значением собирается вручную и разработчик по ошибке кодирует всю строку после ? через encodeURIComponent, символы & и = между параметрами тоже превратятся в %26 и %3D — рекламная система получит один нечитаемый параметр вместо набора меток, и статистика по кампании сломается.
Когда это нужно
- Формирование ссылки с кириллическим поисковым запросом или названием товара в параметре.
- Проверка, что 1С или другая система корректно собрала ссылку с кириллицей в пути.
- Декодирование ссылки из лога сервера, где вместо текста видны только
%D0%....
Edge case: двойное кодирование в редиректах
Ссылки-редиректы (например, из письма рассылки или трекера кликов) иногда кодируют уже закодированный адрес ещё раз — тогда символ % сам становится %25, и вместо кириллицы получается двойная каша вида %25D0%25A1. Такое часто случается, когда один сервис передаёт ссылку другому, а оба самостоятельно вызывают кодирование, не проверяя, закодирована ли строка уже.