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

时间:2012-02-16 21:53:45

标签: c# url uri

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

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

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

例如,尝试这样做会导致问题:

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

它似乎将哈希解释为片段指示符。

用%23手动替换#感觉不对。是否还有其他角色需要更换? 在Uri和HttpUtility中有一些逃避方法,但似乎没有一种方法可以解决这个问题。

3 个答案:

答案 0 :(得分:5)

你不应该使用几个字符。您可以尝试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#")
);

答案 1 :(得分:4)

还有一些朋友在挖掘朋友并发现了一个重复的问题: 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的查询字符串/片段部分 - 而不是方案或主机名。

答案 2 :(得分:2)

使用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();
    }
}