2012-02-16 4 views
14

のパスを適切にエンコードするには、ハッシュ(#)が含まれていますか?ハッシュはフラグメント(ブックマーク?)インジケータではなく、パス名の一部です。例えばハッシュを含むパスをエンコードする方法は?

、このようなパスがある場合:

http://www.contoso.com/code/c#/somecode.cs

あなたはたとえばこれを実行しようとすると、それは問題が発生します。

Uri myUri = new Uri("http://www.contoso.com/code/c#/somecode.cs"); 

はハッシュを解釈するように思わフラグメントインジケータとして。

手動で#を%23に置き換えるのは間違いです。交換すべき他の文字はありますか? UriとHttpUtilityにはいくつかのエスケープ方法がありますが、そのトリックを行う人はいません。

答えて

3

は、いくつかのより多くの掘りの友人を行なったし、見つかったのJavaの重複質問: HTTP URL Address Encoding in Java

しかし、.Net Uriクラスは、必要なコンストラクタを提供しませんが、UriBuilderはありません。

ので、パスが不正な文字が含まれている適切なURIを構築するために、この操作を行う:それはのようなが不必要にエスケープする必要はありませんURIの部分を(逃げられないんか

// Build Uri by explicitly specifying the constituent parts. This way, the hash is not confused with fragment identifier 
UriBuilder uriBuilder = new UriBuilder("http", "www.contoso.com", 80, "/code/c#/somecode.cs"); 

Debug.WriteLine(uriBuilder.Uri); 
// This outputs: http://www.contoso.com/code/c%23/somecode.cs 

お知らせthe://部分)を使用します。これは、HttpUtility.UrlEncodeの場合です。このクラスの目的は、実際にはスキームやホスト名ではなく、URLのクエリー・ストリング/フラグメント部分をエンコードすることにあると思われます。

1

使用UrlEncodeSystem.Web.HttpUtility.UrlEncode(string)

class Program 
{ 
    static void Main(string[] args) 
    { 
     string url = "http://www.contoso.com/code/c#/somecode.cs"; 
     string enc = HttpUtility.UrlEncode(url); 

     Console.WriteLine("Original: {0} ... Encoded {1}", url, enc); 
     Console.ReadLine(); 
    } 
} 
+0

例の文字列encはエスケープされていますが、もはや有効なURIではありません。 Uri uri = new Uri(enc)を試してください。無効なURI例外がスローされます。しかし、正しい解決策を見つけました。 – Dodgyrabbit

+0

興味深い。私は、MSDNのドキュメントでちょっと混乱しています。それは、_EncodesにURL文字列が書かれています。 UrlEncodeメソッドを使用すると、クエリ文字列の値など、URL全体をエンコードできます._(http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx参照) – LiquidPony

3

あなたが使用することを想定していないいくつかの文字があります。 work your way through this very dry documentationを試すか、handy URL summary on Stack Overflowを参照してください。

このウェブサイトをチェックすると、C#の質問が%23にエンコードされていることがわかります。

Stack Overflow C# Questions

あなたは、このいずれか(ASP.NET用)を使用して行うことができます。

string.Format("http://www.contoso.com/code/{0}/somecode.cs", 
    Server.UrlEncode("c#") 
); 

やクラスライブラリ/デスクトップ用:

string.Format("http://www.contoso.com/code/{0}/somecode.cs", 
    HttpUtility.UrlEncode("c#") 
); 
+0

ニースリンク.. C#エンコーディングなし!良いトリック! –

+0

このようにURL全体を(スキームとパスを含めて)エンコードすると、実際には有効なURIではない文字列が生成されます。それは無効なURIをスローする:あなたがそれからURIを構築しようとすると、URIのフォーマットは決定できませんでした。 – Dodgyrabbit

+0

ありがとう - 例が更新されました。 – Fenton

関連する問題