2012-02-16 28 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所在的路徑中含有非法字符,這樣做:

// 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 

注意它是如何做不必要的逃避不需要逃避URI的部分(如://部分),HttpUtility.UrlEncode就是這種情況。看起來這個類的目的實際上是編碼URL的querystring/fragment部分 - 而不是方案或主機名。

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 2012-02-17 02:57:56

+0

有趣。我有點迷惑MSDN文檔,然後,它說_Encodes一個URL字符串。 UrlEncode方法可用於編碼整個URL,包括查詢字符串values._(請參閱http://msdn.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx) – LiquidPony 2012-02-17 19:29:36

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#!好戲! – 2012-02-16 22:11:36

+0

請注意,以這種方式編碼整個URL(包括方案和路徑)實際上會產生一個不是有效URI的字符串。它會拋出無效URI:如果嘗試從中構建URI,則無法確定URI的格式。 – Dodgyrabbit 2012-02-17 02:53:18

+0

是的 - 更新了示例。 – Fenton 2012-02-17 10:03:14