Для предупреждения вы делаете кодировку самостоятельно. Возможно, это выглядит так же, как на стороне сервера, если вы удалили encodeURIComponent
.
На стороне сервера ASP.NET всегда будет отображать незашифрованную форму. Это облегчает непосредственное сопоставление с файлами, которые также имеют текст, который необходимо (не) кодировать.
Обратите внимание, что вы можете заменить каждую букву для ее представления UTF8 в кодировке URL. Это будет все тот же URL. Т.е. наберите в окне браузера следующее, и оно все равно будет работать: %66%59%6E%64.aspx?location=Seattle%2C%20WA
. Чтобы кодировать только необходимые символы, используйте UrlEncode на стороне сервера, если вы сами создаете ссылку.
Кодировка URL может стать довольно сложной задачей. Вы просите объяснить это. Чтобы узнать правильное экранирование определенного персонажа, вам нужно знать, как этот персонаж выглядит в UTF8. Шестнадцатеричное значение байтов UTF-8 становится значением% XX% YY вашего письма. Иногда это один% XX, но всего может быть до шести байтов (например, некоторые китайские иероглифы).
Кодирование URL работает только в одну сторону. Никогда не кодируйте дважды и не кодируйте дважды. Это запрещено спецификацией. Кроме того, поскольку вы можете кодировать любой символ, не всегда возможно (как вы узнали) выполнить кодирование / дешифрование в обе стороны. Если вы расшифруете и снова закодируете, вполне возможно, что результирующая строка будет другой, но синтаксически одинаковой.
В HTML URL-адрес Кодировка иногда перемежается с HTML-кодировкой . То есть амперсанд действителен в HTML, но не в HTML. find.aspx?city=A&name=B
становится find.aspx?city=A&name=B
в URL-адресе HTML. Тем не менее, браузеры снисходительны и неправильно принимают строки в кодировке HTML.
Наконец, нет в браузере: если вы введете пробел в ссылке, даже внутри тега <a>
, он уйдет за пробел (или другой символ) для вас. Кроме того, в настоящее время он будет отображать нечетные символы (é, ï и т. Д.) В адресной строке, но когда он отправляет его по HTTP, браузер правильно сделает кодировку для вас.
Обновление: об ответе на ваш вопрос о необходимости "окончательной" ссылки или доказательства.
Хотя я не смог найти ничего в интернете, я решил сам поискать его с помощью Reflector. Проходя через методы, которые устанавливают, например, HttpRequest.QueryString
, вы быстро сталкиваетесь с закрытым методом HttpRequest.FillInQueryStringCollection
, который затем вызывает HttpValueCollection.FillfromEncodedBytes
. Несколько ближе к концу этого метода для значений вызывается HttpUtility.UrlDecode
. Вывод: не называйте это сами, чтобы предотвратить двойное декодирование.
Вы можете убедиться в этом сами, загрузив Reflector и разобрав .NET-библиотеки System.Web.