我试图编写一个Windows客户端应用程序,该应用程序调用网站以获取数据。为了尽量减少安装,我尝试仅使用.NET Framework Client Profile中的dll。问题是我需要对一些参数进行UrlEncode编码,是否有一种简单的方法可以在不导入不属于客户端Pofile的System.Web.dll的情况下执行此操作?
WebRequest
或WebClient
。这就是我询问此特定代码的原因,因为可以对正确的url编码数据进行某些操作。
我试图编写一个Windows客户端应用程序,该应用程序调用网站以获取数据。为了尽量减少安装,我尝试仅使用.NET Framework Client Profile中的dll。问题是我需要对一些参数进行UrlEncode编码,是否有一种简单的方法可以在不导入不属于客户端Pofile的System.Web.dll的情况下执行此操作?
WebRequest
或WebClient
。这就是我询问此特定代码的原因,因为可以对正确的url编码数据进行某些操作。
Answers:
System.Uri.EscapeUriString()
某些字符可能有问题,对我而言,它是字符串中的数字/磅“#”符号。
如果这对您来说是一个问题,请尝试:
System.Uri.EscapeDataString() //Works excellent with individual values
这是一个SO答案,解释了区别:
EscapeUriString和EscapeDataString有什么区别?
并建议Uri.EscapeDataString()
在任何方面使用。
Uri.EscapeUriString
确实确实存在很大问题,因此不应该使用它,因为它试图做一些实际上不可能始终如一地做的事情(转义完整的URI)。有关详细说明,请参见此答案。
在.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
请随时对其进行编辑,并将新字符添加到我的测试字符串中,或者将其保留在注释中,然后我将对其进行编辑。
EscapeDataString
而不是EscapeUriString
编码回车和换行符,而这需要由EscapeDataString
您可以使用
Uri.EscapeUriString(请参阅http://msdn.microsoft.com/zh-cn/library/system.uri.escapeuristring.aspx)
Uri.EscapeUriString
。它不能“理解”应该对哪些部分进行编码,而只是在做某些事情(转义完整的URI)时被误导了,这实际上是不可能始终如一地进行的。请参阅此答案以获取详细说明。
这里的答案很好,但对我来说仍然不够。
我写了一个小循环,比较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数据中不得包含保留字符'='
和';'
。
Uri.EscapeUriString
,因为转义完整的URI不可能始终如一。请参阅此答案以获取详细说明。
客户端配置文件System.dll中存在一个客户端配置文件可用版本System.Net.WebUtility类。这是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);
}
要不使用System.Web进行UrlEncode:
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/