如何正确编码包含哈希(#)的路径?请注意,哈希不是片段(书签?)指示符,而是路径名称的一部分。
例如,如果有这样的路径:
http://www.contoso.com/code/c#/somecode.cs
例如,尝试这样做会导致问题:
Uri myUri = new Uri("http://www.contoso.com/code/c#/somecode.cs");
它似乎将哈希解释为片段指示符。
用%23手动替换#感觉不对。是否还有其他角色需要更换? 在Uri和HttpUtility中有一些逃避方法,但似乎没有一种方法可以解决这个问题。
答案 0 :(得分:5)
你不应该使用几个字符。您可以尝试work your way through this very dry documentation,或参考此handy URL summary on Stack Overflow。
如果您查看此网站,您会发现他们的C#问题已编码为%23
。
您可以使用(对于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)
使用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();
}
}