В URL нельзя использовать некоторые символы, например пробел. Другие же имеют специальные функции. Например, в формах HTML символ = отделяет параметр от его значения. По этой причине в универсальном синтаксисе URI применяется кодирование URL, в то время как в формах HTML такие символы не кодируются, а заменяются.
Например, пробелы в строке кодируются символами %20 или заменяются знаком плюса (+). Если в качестве разделителя вы используете вертикальную черту (|), ее нужно кодировать символами %7C. Запятая в строке должна кодироваться символами %2C.
Чтобы правильно экранировать URL на платформе, рекомендуется автоматически кодировать URL с помощью ее стандартных библиотек.
Создание действительного URL
URL, введенный в адресную строку браузера, не всегда бывает действительным. Он может содержать специальные символы (например, "上海+中國"). Перед тем как выполнить переход по указанному адресу, браузер должен преобразовать эти символы в другую кодировку.
Аналогичным образом любой код, который создает или получает данные в формате UTF-8, может считать URL-адреса с символами UTF-8 действительными, но ему потребуется преобразовать эти символы, прежде чем отправлять их на веб-сервер.
Этот процесс называется кодированием URL или процентным кодированием.
Специальные символы
Необходимость преобразования символов связана с тем, что все URL должны соответствовать синтаксису, указанному в спецификации унифицированного идентификатора ресурсов (URI). На практике это значит, что URL должны содержать только определенный набор символов ASCII: стандартные буквенно-числовые символы и несколько зарезервированных символов, используемых в 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-адресах для обозначения начала строки запроса. Если вы хотите передать строку "? 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 может существенно увеличиться.