如何在不使用 System.Web 的情况下进行 UrlEncode?

9 浏览
0 Comments

如何在不使用 System.Web 的情况下进行 UrlEncode?

我正在尝试编写一个调用网站数据的Windows客户端应用程序。为了尽量减少安装大小,我只使用.NET Framework Client Profile中的dll。问题是我需要对一些参数进行UrlEncode,有没有一种不需要导入System.Web.dll(不属于Client Profile)的简便方法?

0
0 Comments

问题的原因是想要进行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进行编码。

0
0 Comments

在.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版本开始可用。

0
0 Comments

问题的原因是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)实际上是不可能一致做到的。详细解释请参见这个答案

还有一个空格字符。

0