Целью экранирования символов является то, что они не будут обрабатываться как аргументы. Таким образом, вы на самом деле не хотите кодировать весь URL, только значения, которые вы передаете через строку запроса. Например:
http://example.com/?parameter1=<ENCODED VALUE>¶meter2=<ENCODED VALUE>
URL-адрес, который вы указали, на самом деле является совершенно корректным, который пройдет проверку. Однако браузер будет интерпретировать символы &
как разрыв между параметрами в строке запроса. Итак, ваша строка запроса:
?q=whatever&lang=en
Будет фактически переведено получателем как два параметра:
q = "whatever"
lang = "en"
Чтобы ваш URL работал, вам просто нужно убедиться, что ваши значения кодируются:
?q=<ENCODED VALUE>&lang=<ENCODED VALUE>
Редактировать : На странице общих проблем W3C, на которую вы ссылались, говорится о крайних случаях, когда URL-адреса отображаются в формате HTML, а за &
следует текст, который можно интерпретировать как ссылку на сущность ( ©
например). Вот тест в jsfiddle, показывающий URL:
http://jsfiddle.net/YjPHA/1/
В Chrome и FireFox ссылки работают правильно, но IE отображает ©
как & copy;, разрывая ссылку. Я должен признать, что у меня никогда не было проблем с этим в дикой природе (это затронет только те ссылки на сущности, которые не требуют точки с запятой, которая является довольно небольшим подмножеством).
Чтобы вы были в безопасности от этой ошибки, вы можете HTML кодировать любой из ваших URL-адресов, которые вы выводите на страницу, и все будет в порядке. Если вы используете ASP.NET, метод HttpUtility.HtmlEncode
должен работать просто отлично.