如何在不使用 System.Web 的情况下进行 UrlEncode?
-
27-09-2019 - |
题
我正在尝试编写一个调用网站获取数据的 Windows 客户端应用程序。为了将安装保持在最低限度,我尝试只使用 .NET Framework 客户端配置文件中的 dll. 。问题是我需要对一些参数进行 UrlEncode,有没有一种简单的方法可以在不导入不属于 Client Pofile 一部分的 System.Web.dll 的情况下执行此操作?
解决方案
System.Uri.EscapeUriString()
可与某些字符有问题的,对我来说是一个数/磅“#”的字符串中的标志。
如果这是你的一个问题,请尝试:
System.Uri.EscapeDataString() //Works excellent with individual values
下面是一种SO问题答案,解释了差:
有何EscapeUriString和EscapeDataString?
和建议使用的 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
(v4.0 之前)对于更常见的字符:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
笔记: EscapeUriString
将保留一个有效的 uri 字符串,这会导致它使用尽可能多的明文字符。
请参阅此答案以获取比较各种编码的表:
https://stackoverflow.com/a/11236038/555798
换行符所有这些都列在这里(除了 HttpUtility.HtmlEncode
) 将转换 "\n\r"
进入 %0a%0d
或者 %0A%0D
请随意编辑此内容并向我的测试字符串添加新字符,或者将它们留在评论中,我将对其进行编辑。
可以使用
Uri.EscapeUriString(见 http://msdn.microsoft的.com / EN-US /库/ system.uri.escapeuristring.aspx )
下面这些问题的答案都非常好,但仍不足以对我来说。
我写了一个小环与Uri.EscapeUriString
对所有字符从0到255进行比较Uri.EscapeDataString
。
注意:这两个函数具有内置的智能上述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数据不能包含保留字符'='
和';'
。
有一个客户简档可用的版本,System.Net.WebUtility类中,存在于客户端配置文件System.dll中。这里的MSDN链接:
下面是发送POST请求正确编码使用application/x-www-form-urlencoded
内容类型参数的一个示例:
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 /提防-webutility-进行urlencode-VS-httputility-进行urlencode /
System.Net.WebUtility.HtmlDecode