Какие символы должны быть экранированы в строке HTTP-запроса?

Этот вопрос касается символов в части строки запроса URL-адреса, которые появляются после? пометить персонажа.

вВикипедиянекоторые символы остаются как есть, а другие кодируются (обычно% escape 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 производство.)

Ответы на вопрос(1)

Ваш ответ на вопрос