2013-11-15 3 views
5

Что-то странный вопросом, но давайте посмотрим, какой ответ он получает ...Uri.EscapeUriString с квадратным брекетом

Если я код консольного приложения (VS 2013, .NET 4.5.1) и выполнить эту строку кода:

Uri.EscapeUriString("[")

Я получаю это:

[

Однако, если я выполняю то же самое (хорошо, технически Uri.EscapeUriString("[").Dump()) в LINQPad на моей машине, я получаю это:

%5B

Чтобы еще более усложнить вещи, according to this postUri.EscapeUriString("[") действительно должен вернуться %5B .The пост был написан на 27/06/2012.

Я думаю, что, возможно, LINQPad ссылается на более старую DLL, чем на VS, но это означало бы, что EscapeUriString изменилось сравнительно недавно, и я не могу найти никаких записей. Есть ли у кого-нибудь идеи относительно того, что может вызывать такое поведение?

+0

WT? Я могу воспроизвести в 4.5.1! –

ответ

5

Это изменилось между .Net 4 и .Net 4.5, которое вы можете проверить, переназначив версию фрейма на .Net 4 и запустив тестовую программу.

.Net 4 -> Выходы "% 5B" .net 4.5 (или более поздней) -> выходы "["

Это упоминается здесь: Application Compatibility in the .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 «s говорится, что

По умолчанию метода EscapeUriString преобразует все символы, кроме RFC 2396 неблокированных символов, их шестнадцатеричного представления

Таким образом, казалось бы, произошла ошибка до .NET 4.0, которая была исправлена ​​в 4.5.1.

+0

Неверный. До .NET 4.0, RFC 2396 выполняется правильно. Символы, которые не экранированы, перечислены в строке 469, а не 570. Точка Net 4.5.1 фактически следует за символами, перечисленными в том же разделе RFC 3986, которые отличаются. –

Смежные вопросы