Этот вопрос касается символов в части строки запроса URL-адреса, которые появляются после символа ?
.
В Википедии , некоторые символы остаются без изменений, а другие кодируются (обычно с помощью %
escape-последовательности).
Я пытался отследить это до фактических спецификаций, чтобы я понял обоснование каждого пункта в этой странице Википедии.
Пример противоречия 1:
Спецификация HTML говорит, что кодирует пространство как +
, а все остальное принимает значение RFC1738 . Однако в этом RFC говорится, что ~
небезопасно и, кроме того, что «все небезопасные символы должны всегда кодироваться в URL». Кажется, это противоречит Википедии.
На практике IE8 кодирует ~
в строках запроса, которые он генерирует, а FF3 оставляет его как есть.
Противоречие Пример 2:
Википедия утверждает, что все символы, которые она не упоминает, должны быть закодированы. !
не упоминается в Википедии. Но RFC1738 утверждает, что !
является «специальным» символом и «может использоваться без кодировки». Кажется, это противоречит Википедии, в которой говорится, что она должна быть закодирована.
На практике IE8 кодирует !
в строках запроса, которые он генерирует, в то время как FF3 оставляет его как есть.
Я понимаю, что мораль этого, вероятно, будет заключаться в кодировании тех символов, которые вызывают сомнения между Википедией и спецификациями. Возможно, даже заходит так далеко, что кодирует все, что не является [A-Za-z0-9]. Я просто хотел бы знать фактические стандарты по этому вопросу.
Выводы
Алгоритм, описанный в Википедии, кодирует именно те символы, которые не являются RFC3986 незарезервированными символами . То есть он кодирует все символы, кроме буквенно-цифровых символов и -._~
. В особом случае пробел кодируется как +
вместо %20
согласно RFC3986.
Некоторые приложения используют более старый RFC. Для сравнения, RFC2396 незарезервированные символы являются буквенно-цифровыми и !'()*-._~
.
Для сравнения, Алгоритм рабочего проекта HTML5 кодирует все символы, кроме буквенно-цифровых символов и *-._
. В особом случае кодировка для места остается +
. Заметные различия заключаются в том, что *
не кодируется, а ~
кодируется. (Технически, эта обработка *
совместима с RFC3986, даже если *
находится в reserved
, потому что это в sub-delims
, которые разрешены в производстве query
.)