2012-01-02 13 views
1

私は以下のコードを使用しているWP7プロジェクトを持っています。それは通常正常に動作しますが、私はいくつかの特定の文字列が渡されて奇妙な結果を得ています。C#URL QueryString Trouble

Service = "3q%23L3t41tGfXQDTaZMbn%23w%3D%3D?f" 

NavigationService.Navigate(new Uri("/Details.xaml?service=" + Service, UriKind.Relative)); 

次のページへ:?==ワット

NavigationContext.QueryString.TryGetValue("service", out Service1); 

Service1の今= 3Q#L3t41tGfXQDTaZMbn位

fはなぜ文字列が変更されましたか?

答えて

2

文字列は変更されていませんが、2つの異なる方法で見ています。

3q#L3t41tGfXQDTaZMbn#w==?fをURIコンテンツとしてエンコードする方法は、3q%23L3t41tGfXQDTaZMbn%23w%3D%3D?fです。 (実際には3q%23L3t41tGfXQDTaZMbn%23w%3D%3D%3Ffですが、末尾付近の?はこのコンテキストでは%3Fに正しくエスケープされていません。

文字列を書く方法は、文字列をエスケープすることを期待しています。

文字列を読み取る手段は、エスケープされていない文字列を返します。

物事はかなり完全に、本当に働いています。

あなたはちょうどそれを再び脱出、再び文字列を記述する必要が

は:

Service = Uri.EscapeDataString(Service1); 
+0

ありがとうございました。 –

2

最初のコードスニペットでは、文字列はURLエンコードされています。

2番目のコードスニペットでは、文字列はURLデコードされています。

これらは本質的に同じ文字列で、エンコードが適用/削除されただけです。例えば

:あなたは、さらに読書のため%23

を取得# URLエンコードすると、このwikipedia article on encodingをチェックしてください。

HttpUtilityはWP7 Silverlightスタックの一部ではないため、エスケープされていないURIをエスケープするには、Uri.EscapeUriStringを使用することをおすすめします。

+1

'Uri.EscapeUriString'は適切ではない、彼らはこのために' Uri.EscapeDataString'をしたいと思います。前者はURIに現れない文字をエスケープします。後者はURIで特別な意味を持つ文字をエスケープします。 (公正では、MSDNのドキュメントは、違いが何であるかを遠隔で明らかにしていません)。 –

2

文字列を無傷で通過させたい場合は、おそらくURLエンコードする必要があります。

+0

彼がこれを行う場合を除いて、彼のコードは期待どおりに動作しません。 – Alan

+0

彼は何を期待しているのか分かりません。彼はそれが変わったとメモしています。 –