developer • 7 мин чтения • Обновлено: 2026-09-20

Стандарт RFC 3986: зарезервированные символы и Percent-Encoding

Интернет-ссылки строятся на строгих правилах спецификации RFC 3986 (Uniform Resource Identifier). В этой статье подробно разбираем механизм процентильного кодирования (Percent-Encoding), почему русские буквы превращаются в конструкции вида %D0%BF, а также нюансы между encodeURI и encodeURIComponent в JavaScript.

Анатомия URL и исторические ограничения ASCII

Архитектура адресации Интернета создавалась на базе 7-битной таблицы ASCII (значения кодов от 0 до 127). Стандарт RFC 3986 разделяет все символы в URL на две категории:

1. Не зарезервированные (Unreserved): латинские буквы A-Z, a-z, цифры 0-9, и 4 спецсимвола: дефис -, подчёркивание _, точка ., тильда ~. Они никогда не требуют кодирования;
2. Зарезервированные (Reserved): символы, имеющие специальное синтаксическое значение в структуре URI: :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, =.

Любые символы за пределами таблицы US-ASCII (включая все буквы кириллицы) не могут быть переданы в чистом виде по стандарту HTTP и обязаны преобразовываться в шестнадцатеричные процентильные коды.

Полезный инструмент: Для экранирования параметров веб-адресов применяйте инструмент URL Encode / Decode.

Полезный инструмент: Для кириллических ссылок также полезна транслитерация текста онлайн.

Полезный инструмент: При создании компактных ссылок для штрихкодов используйте генератор QR-кодов.

Механизм кодирования кириллицы (UTF-8 в Percent-Encoding)

Каждая буква русского алфавита в стандарте UTF-8 занимает ровно 2 байта. Процесс кодирования происходит следующим образом:

1. Буква «П» в таблице Юникода имеет номер U+041F;
2. В кодировке UTF-8 она представляется двумя байтами: 0xD0 и 0x9F;
3. Перед каждым шестнадцатеричным байтом добавляется знак процента %:
Буква «П» -> %D0%9F.
4. Буква «п» (строчная) в UTF-8 состоит из байтов 0xD0 и 0xBF -> %D0%BF.

Именно поэтому одно русское слово из 6 букв («привет») при кодировании превращается в последовательность из 36 ASCII-символов:
%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82.

Разница между encodeURI и encodeURIComponent в JavaScript

Это классический вопрос на технических собеседованиях разработчиков:

• encodeURI(uri): предназначена для кодирования законченного URL-адреса. Она не кодирует зарезервированные разделители протокола и структуры: ;,/?:@&=+$#. Используется, когда нужно передать полный адрес со схемой и доменом;
• encodeURIComponent(str): кодирует абсолютно всё, включая /, ?, & и =. Она предназначена исключительно для значений query-параметров внутри строки запроса.

Опасная ошибка: если применить encodeURIComponent ко всей ссылке https://site.ru/?q=1, двоеточие и слэши превратятся в %3A%2F%2F, и браузер не сможет открыть такой адрес.

Часто задаваемые вопросы (FAQ)

В спецификации RFC 3986 пробел строго кодируется как %20. Знак плюса «+» для пробела исторически используется только в теле форм application/x-www-form-urlencoded при отправке POST-запросов.

Символ процента «%» сам по себе закодируется в «%25». В результате строка %D0%BF превратится в %25D0%25BF, что приведёт к искажению данных в базе.

Воспользуйтесь инструментом «URL Encode / Decode» на Utilora.ru: мгновенная расшифровка процентов, разбор UTM-меток и таблица параметров.

Скопировано в буфер обмена!