如何编码包含哈希的路径?

你如何正确编码包含哈希(#)路径 ? 请注意,哈希不是片段(书签?)指示符,而是路径名称的一部分。

例如,如果有这样的路径:

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

例如,尝试执行此操作时会导致问题:

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

似乎它将散列解释为片段指示符。

用%23手动替换#感觉不对。 是否还有其他角色需要更换? 在Uri和HttpUtility中有一些转义方法,但似乎没有一个可以做到这一点。

你不应该使用几个字符。 您可以尝试通过这个非常干燥的文档来工作 ,或者参考Stack Overflow上的这个方便的URL摘要 。

如果您查看这个网站,您会看到他们的C#问题编码为%23

Stack Overflow C#问题

您可以使用(对于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#") ); 

做了更多的朋友,发现了一个重复的Java问题:Java中的HTTP URL地址编码

但是,.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的查询字符串/片段部分 – 而不是方案或主机名。

使用UrlEncode : System.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(); } }