2013-11-15 6 views
5

何かをブレースが、私はコンソールアプリケーション(VS 2013、.NET 4.5.1)をコードし、この行を実行した場合のそれは...Uri.EscapeUriStringは奇妙な質問の

を取得し、応答の種類を見てみましょう私は同じことを実行した場合(ただし

[

:コードの:

Uri.EscapeUriString("[")

私はこれを取得しますまあ、技術的にUri.EscapeUriString("[").Dump())LINQPadで私のマシン上で、私はこれを取得:さらに物事を複雑にする

%5B

を、according to this postUri.EscapeUriString("[")は確か%5B【選択ポストは27/06/2012に書かれた返さなければなりません。

おそらくLINQPadがVSで使用されているDLLよりも古いDLLを参照していると考えていますが、これは比較的最近に変更されたことを意味します。この行動を引き起こす可能性のあることについて誰かが考えていますか?

+0

WT?私は4.5.1で再製作することができます! –

答えて

5

これは.Net 4と.Net 4.5の間で変更されました。これは、フレームワークバージョンを.Net 4にリターゲットしてテストプログラムを実行することで確認できます。

ネット4 - >出力の "%5B" .NET 4.5(またはそれ以降) - >出力 "["

これは、ここに記載されている:Uri.EscapeDataStringためのセクション下Application Compatibility in the .NET Framework 4.5

を、(.NET 4.5で)と述べてUri.EscapeUriString、およびUri.UnescapeDataString、:

の予約と予約されていない文字のリストは、今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で、それは述べて:Uri.EscapeUriStringのマニュアルで

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  = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`" 

を、それがデフォルトで

は、EscapeUriString方法は、その16進表現

に、RFC 2396非予約文字を除く、すべての文字を変換し、と述べています

.NET 4.0では4.5.1で修正されたバグがあったようです。

+0

が正しくありません。最大.NET 4。0の場合、RFC 2396に正しく従います。エスケープされない文字は、570ではなく、469行目にリストされています。ドットネット4.5.1は実際にはRFC 3986の同じセクションに記載されている文字に従います。 –