你如何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.EscapeUriString
和Uri.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