你如何UrlEncode不使用System.Web?

我正在尝试编写一个调用数据网站的Windows客户端应用程序。 为了保持最低限度的安装我试图只在.NET Framework客户端configuration文件中使用dll 。 麻烦的是,我需要UrlEncode一些参数,是否有一个简单的方法来做到这一点,而不导入System.Web.dll不是客户端Pofile的一部分?

System.Uri.EscapeUriString()可能会对某些字符有问题,对我来说,这是string中的数字/磅“#”号。

如果这对您是个问题,请尝试:

 System.Uri.EscapeDataString() //Works excellent with individual values 

这是一个SO问题的答案,解释了这种差异:

EscapeUriString和EscapeDataString有什么区别?

并build议在任何方面使用Uri.EscapeDataString()

在.Net 4.5+中使用WebUtility

只是格式化我提交这个答案。

找不到比较它们的好例子:

 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 

在.Net 4.5+中使用WebUtility .UrlEncode

这似乎复制HttpUtility.UrlEncode (pre-v4.0)为更常见的字符:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
注意: EscapeUriString会保留一个有效的uristring,这使得它使用尽可能多的明文字符。

查看这个答案的表格比较各种编码:
https://stackoverflow.com/a/11236038/555798

换行符所有这些( HttpUtility.HtmlEncode )都会将"\n\r"转换为%0a%0d%0A%0D

请随意编辑它,并添加新的字符到我的testingstring,或留在评论中,我会编辑它。

您可以使用

Uri.EscapeUriString(请参阅http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx

这里的答案很好,但对我来说还是不够的。

我写了一个小循环,比较Uri.EscapeUriStringUri.EscapeDataString ,从0到255的所有字符。

注意:这两个函数都具有内置智能,0x80以上的字符首先是UTF-8编码,然后编码百分比。

结果如下:

 ******* Different ******* '#' -> Uri "#" Data "%23" '$' -> Uri "$" Data "%24" '&' -> Uri "&" Data "%26" '+' -> Uri "+" Data "%2B" ',' -> Uri "," Data "%2C" '/' -> Uri "/" Data "%2F" ':' -> Uri ":" Data "%3A" ';' -> Uri ";" Data "%3B" '=' -> Uri "=" Data "%3D" '?' -> Uri "?" Data "%3F" '@' -> Uri "@" Data "%40" ******* Not escaped ******* '!' -> Uri "!" Data "!" ''' -> Uri "'" Data "'" '(' -> Uri "(" Data "(" ')' -> Uri ")" Data ")" '*' -> Uri "*" Data "*" '-' -> Uri "-" Data "-" '.' -> Uri "." Data "." '_' -> Uri "_" Data "_" '~' -> Uri "~" Data "~" '0' -> Uri "0" Data "0" ..... '9' -> Uri "9" Data "9" 'A' -> Uri "A" Data "A" ...... 'Z' -> Uri "Z" Data "Z" 'a' -> Uri "a" Data "a" ..... 'z' -> Uri "z" Data "z" ******* UTF 8 ******* ..... 'Ò' -> Uri "%C3%92" Data "%C3%92" 'Ó' -> Uri "%C3%93" Data "%C3%93" 'Ô' -> Uri "%C3%94" Data "%C3%94" 'Õ' -> Uri "%C3%95" Data "%C3%95" 'Ö' -> Uri "%C3%96" Data "%C3%96" ..... 

EscapeUriString用于编码URL,而EscapeDataString用于编码Cookie的内容,因为Cookie数据不能包含保留字符'='';'

有一个客户端configuration文件可用的版本,System.Net.WebUtility类,存在于客户端configuration文件System.dll中。 这是MSDN链接:

WebUtility

下面是使用application/x-www-form-urlencoded内容types发送正确编码参数的POST请求的示例:

 using (var client = new WebClient()) { var values = new NameValueCollection { { "param1", "value1" }, { "param2", "value2" }, }; var result = client.UploadValues("http://foo.com", values); } 

到UrlEncode而不使用System.Web:

 String s = System.Net.WebUtility.UrlEncode(str); //fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant()); 

更多详情: https : //www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/

 System.Net.WebUtility.HtmlDecode