Руководство12 мин чтения

Полное руководство по URL-кодированию

Узнайте всё об URL-кодировании: что это такое, почему это важно, как работает процентное кодирование и какие есть лучшие практики для обработки специальных символов в URL.

Что такое URL-кодирование?

URL-кодирование, также известное как процентное кодирование (percent-encoding), — это механизм кодирования информации в унифицированном идентификаторе ресурса (URI) при определённых условиях. Хотя его называют URL-кодированием, оно применяется и в более широком смысле ко всему множеству унифицированных идентификаторов ресурсов (URI), которое включает как унифицированный указатель ресурса (URL), так и унифицированное имя ресурса (URN).

Кодирование необходимо потому, что URL можно передавать через интернет только с использованием набора символов ASCII. Поскольку URL часто содержат символы за пределами набора ASCII, URL приходится преобразовывать в допустимый формат ASCII. При URL-кодировании небезопасные символы ASCII заменяются символом %, за которым следуют две шестнадцатеричные цифры.

Как работает процентное кодирование?

Механизм процентного кодирования преобразует каждый символ, который нужно закодировать, в один или несколько байтов. Затем каждый байт представляется знаком процента, за которым следуют две шестнадцатеричные цифры. Шестнадцатеричные цифры представляют значение байта символа в заданной кодировке (обычно UTF-8).

Например, символ пробела (значение ASCII 32, hex 20) превращается в %20. Амперсанд & (значение ASCII 38, hex 26) превращается в %26. Символы, не входящие в ASCII, например e с акутом, сначала кодируются в последовательность байтов UTF-8, а затем каждый байт подвергается процентному кодированию.

Зарезервированные и незарезервированные символы

RFC 3986 определяет для URI две категории символов: зарезервированные и незарезервированные. К незарезервированным символам относятся прописные и строчные буквы (A-Z, a-z), цифры (0-9), дефисы (-), точки (.), символы подчёркивания (_) и тильды (~). Эти символы можно включать в URI без кодирования.

Зарезервированные символы имеют особое значение в синтаксисе URL. К ним относятся: :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ; и =. Когда эти символы используются в компоненте URI не по своему зарезервированному назначению, их необходимо подвергать процентному кодированию.

URL-кодирование в разных языках

JavaScript

JavaScript предоставляет две пары функций для URL-кодирования: encodeURI() / decodeURI() для кодирования полных URI и encodeURIComponent() / decodeURIComponent() для кодирования отдельных компонентов URI. Ключевое различие в том, что encodeURI() сохраняет зарезервированные символы, имеющие особое значение в URI (такие как /, ?, #), тогда как encodeURIComponent() кодирует все неалфавитно-цифровые символы.

Python

Модуль urllib.parse в Python предоставляет функции quote() и unquote() для базового кодирования и декодирования, а также urlencode() для кодирования словарей в строки запроса. Функция quote() принимает необязательный параметр safe, позволяющий указать символы, которые не следует кодировать.

PHP

PHP предлагает функцию urlencode(), которая кодирует пробелы как + (в соответствии с форматом application/x-www-form-urlencoded), и rawurlencode(), которая кодирует пробелы как %20 (в соответствии с RFC 3986). Для декодирования используйте urldecode() и rawurldecode() соответственно.

Лучшие практики

  • Всегда кодируйте пользовательский ввод перед включением его в URL
  • Используйте encodeURIComponent() для кодирования значений параметров запроса в JavaScript
  • Используйте encodeURI() только при кодировании полного URI
  • Придерживайтесь единообразного подхода к кодированию во всём приложении
  • Всегда декодируйте URL на стороне сервера перед их обработкой
  • Тестируйте кодирование со специальными символами, включая Unicode
  • Не кодируйте URL дважды — всегда проверяйте, не является ли строка уже закодированной

Похожие статьи

Попробуйте наши бесплатные инструменты