Кодирование URL

В URL некоторые символы использовать нельзя (например, пробел), а другие имеют специальное значение. Например, в формах HTML символ = отделяет параметр от его значения. По этой причине в универсальном синтаксисе URI применяется кодирование URL, в то время как в формах HTML такие символы не кодируются, а заменяются.

Например, пробелы в строке кодируются символами %20 или заменяются знаком плюса (+). Если в качестве разделителя вы используете вертикальную черту (|), ее нужно кодировать символами %7C. Запятая в строке должна кодироваться символами %2C.

Чтобы правильно экранировать URL на платформе, рекомендуется автоматически кодировать URL с помощью ее стандартных библиотек.

Что такое действительный URL

URL, введенный в адресную строку браузера, не всегда бывает "действительным". Он может содержать специальные символы (например, "上海+中國"). Перед тем как выполнить переход по указанному адресу, браузер должен преобразовать эти символы в другую кодировку. Аналогичным образом, любой код, который создает или получает данные в формате UTF-8, может считать URL-адреса с символами UTF-8 "действительными", но ему также потребуется преобразовать эти символы, прежде чем отправлять их на веб-сервер. Этот процесс называется кодированием URL или процентным кодированием.

Специальные символы

Необходимость преобразования символов связана с тем, что все URL должны соответствовать синтаксису, указанному в спецификации унифицированного идентификатора ресурсов (URI). На практике это значит, что URL должны содержать только определенный набор символов ASCII: стандартные буквенно-числовые символы и несколько зарезервированных символов, используемых в URL в качестве управляющих.

Символы, которые можно использовать в URL
НаборсимволовИспользование в URL-адресе
Буквенно-числовые a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 Текстовые строки, схема (http), порт (8080) и т. д.
Незарезервированные - _ . ~ Текстовые строки
Зарезервированные ! * ' ( ) ; : @ & = + $ , / ? % # [ ] Управляющие символы или текстовые строки

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

  • Если символы, которые вы хотите использовать, отсутствуют в указанном выше наборе. Например, символы на иностранных языках, такие как 上海+中國, нужно преобразовать с помощью символов из таблицы. По общепринятому соглашению пробелы (которые запрещены в URL) часто передаются с помощью знака плюса '+'.
  • Если зарезервированные символы нужно использовать в их первоначальном значении. Например, символ ? используется в URL-адресах для обозначения начала строки запроса. Если вы хотите передать строку "? and the Mysterions", вам необходимо закодировать вопросительный знак ('?').

Кодирование URL проводится с помощью символа '%' и двухсимвольного шестнадцатеричного значения, соответствующего данному символу в UTF-8. Например, 上海+中國 в UTF-8 будет закодирован для URL как %E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B. Строка ? and the Mysterians будет закодирована для URL как %3F+and+the+Mysterians или %3F%20and%20the%20Mysterians.

Часто используемые символы, требующие кодирования

Ниже показаны закодированные значения для некоторых популярных символов:

Символ Закодированное значение
Пробел %20
" %22
< %3C
> %3E
# %23
% %25
| %7C

Процентное кодирование текста, который вводит пользователь, может оказаться непростой задачей. Например, он может ввести адрес как "5th&Main St." Обычно URL необходимо создавать из отдельных частей, обрабатывая все вводимые пользователем данные как символьные литералы.

Кроме того, URL для всех веб-сервисов платформы Google Карт и Maps Static API могут содержать не более 8192 символов. Для большинства сервисов это ограничение превышается крайне редко, но некоторые могут запрашивать ряд параметров, в результате чего длина URL может существенно увеличиться.