如何在不使用 System.Web 的情况下进行 UrlEncode?
问题的原因是想要进行URL编码,但不想使用System.Web命名空间中的UrlEncode方法。下面是解决方法:
可以使用Uri类中的EscapeUriString方法进行URL编码。EscapeUriString方法会尝试对整个URL进行编码,包括http://部分,而EscapeDataString方法则只会对需要编码的部分进行处理。
在这种情况下,应该使用EscapeDataString方法,因为可能需要将URL作为GET参数传递。在这个示例中,正在对URL进行追加。
不要使用Uri.EscapeUriString方法,因为它并不理解哪些部分应该进行编码,它只是试图对整个URI进行编码,但这是不可行的。可以参考上面提供的链接,了解更详细的解释。
如果想要进行URL编码而不使用System.Web命名空间中的UrlEncode方法,可以使用Uri类中的EscapeDataString方法来实现。这样可以确保只对需要编码的部分进行处理,而不会对整个URL进行编码。
在.NET 4.5及以上版本中,可以使用WebUtility.UrlEncode来进行Url编码,而不使用System.Web。
以下是一段代码示例,用于比较不同的编码方法:
string testString = "http://test# space 123/text?var=val&another=two"; Console.WriteLine("UrlEncode: " + System.Web.HttpUtility.UrlEncode(testString)); Console.WriteLine("EscapeUriString: " + Uri.EscapeUriString(testString)); Console.WriteLine("EscapeDataString: " + Uri.EscapeDataString(testString)); Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+")); Console.WriteLine("HtmlEncode: " + System.Web.HttpUtility.HtmlEncode(testString)); Console.WriteLine("UrlPathEncode: " + System.Web.HttpUtility.UrlPathEncode(testString)); //.Net 4.0+ Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString)); //.Net 4.5+ Console.WriteLine("WebUtility.UrlEncode: " + WebUtility.UrlEncode(testString));
输出结果如下:
UrlEncode: http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo EscapeUriString: http://test#%20space%20123/text?var=val&another=two EscapeDataString: http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo EscapeDataReplace: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo HtmlEncode: http://test# space 123/text?var=val&another=two UrlPathEncode: http://test#%20space%20123/text?var=val&another=two //.Net 4.0+ WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two //.Net 4.5+ WebUtility.UrlEncode: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo
根据输出结果可以看出,WebUtility.UrlEncode方法在对Url进行编码时与HttpUtility.UrlEncode方法的结果相同。
需要注意的是,EscapeUriString方法会保持一个有效的Uri字符串,因此会使用尽可能多的纯文本字符。
如果想要了解不同编码方法的对比,可以参考这个答案中的表格:
[https://stackoverflow.com/a/11236038/555798](https://stackoverflow.com/a/11236038/555798)
对于换行符,除了HttpUtility.HtmlEncode之外,其他方法都会将"\n\r"转换为"%0a%0d"或"%0A%0D"。
在我所遇到的情况中,我们需要对回车和换行进行编码,而这需要使用EscapeDataString方法进行更严格的转义。
如果需要更多示例,可以提供自己的测试用例。这里有一个示例运行了不同的编码方法,展示了它们之间的差异:
[https://dotnetfiddle.net/12IFw1](https://dotnetfiddle.net/12IFw1)
需要注意的是,WebUtility.UrlEncode()和WebUtility.UrlDecode()方法只在.NET 4.5及以上版本中可用,而在4.0版本中是不存在的。
根据MSDN的说明,这两个方法在Universal Windows Platform中自4.5版本开始可用,在.NET Framework中自4.0版本开始可用。
问题的原因是System.Uri.EscapeUriString()
对于某些字符来说是有问题的,对我来说,问题出现在字符串中的数字/井号'#'符号。
解决方法是使用System.Uri.EscapeDataString()
。它可以很好地处理单个值。
下面是一个解释两者之间差异的SO问题答案:What's the difference between EscapeUriString and EscapeDataString?,并建议在任何方面都使用Uri.EscapeDataString()
。
一个旧的博客文章blogs.msdn.com/b/yangxind/archive/2006/11/09/…指出EscapeDataString也有问题,加号不会被解码。
但是,我刚刚使用"Uri Escaped"一个完整的URL,所有的空格都变成了%20,所以我认为他们已经修复了这个问题。我使用的是.Net 4.5。
如果你准备为POST操作准备数据,EscapeDataString也不支持非常长的字符串。这个stackoverflow.com/questions/6695208/…问题讨论了这个问题。
Uri.EscapeUriString
的确有很多问题,不应该使用,因为它试图做一些(转义完整的URI)实际上是不可能一致做到的。详细解释请参见这个答案。
还有一个空格字符。