Uri.EscapeUriString с квадратными скобками
Что-то странное, но давайте посмотрим, какой ответ он получит...
Если я закодирую консольное приложение (VS 2013,.NET 4.5.1) и выполните эту строку кода:
Uri.EscapeUriString("[")
Я получаю это:
[
Однако, если я выполняю ту же самую вещь (ну, технически Uri.EscapeUriString("[").Dump()
) в LINQPad на моей машине, я получаю следующее:
%5B
Чтобы еще больше усложнить ситуацию, в соответствии с этим сообщением Uri.EscapeUriString("[")
действительно должен вернуться %5B
. Сообщение было написано 27/06/2012.
Я думаю, что LINQPad ссылается на более старую DLL, чем на VS, но это подразумевает, что EscapeUriString
изменилось сравнительно недавно, и я не могу найти никаких записей. Кто-нибудь имеет какие-либо идеи относительно того, что может вызвать такое поведение?
Ответы
Ответ 1
Это изменилось между .Net 4 и .Net 4.5, которое вы можете проверить, переназначив версию фрейма на .Net 4 и запустив тестовую программу.
.Net 4 → выходы "% 5B"
.net 4.5 (или более поздняя версия) → выходы "["
Здесь упоминается: Совместимость приложений в .NET Framework 4.5
в разделе Uri.EscapeDataString, Uri.EscapeUriString и Uri.UnescapeDataString, в котором указано, что (с .Net 4.5):
Список зарезервированных и незарезервированных символов теперь поддерживает RFC 3986.
Конкретные изменения:
Unreserved escaped characters are un-escaped.
EscapeDataString escapes reserved characters based on RFC 3986.
EscapeUriString does not escape reserved characters.
UnescapeDataString does not throw an exception if it encounters an invalid escape sequence.
В частности, EscapeUriString не избегает зарезервированных символов, которые являются значительными.
Ответ 2
Новое поведение кажется правильным в соответствии с RFC 2396. В строке 566 указано:
566. Other characters are excluded because gateways and other transport
567. agents are known to sometimes modify such characters, or they are
568. used as delimiters.
569.
570. unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
В документации Uri.EscapeUriString указано, что
По умолчанию метод EscapeUriString преобразует все символы, за исключением безоговорочных символов RFC 2396, в их шестнадцатеричное представление
Таким образом, казалось бы, произошла ошибка в .NET 4.0, которая была исправлена в версии 4.5.1