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

Mar*_*own 302 .net c# urlencode .net-client-profile

我正在尝试编写一个调用网站数据的Windows客户端应用程序.为了使安装保持最小,我尝试仅在.NET Framework客户端配置文件中使用dll.麻烦的是我需要UrlEncode一些参数,有没有一种简单的方法可以在不导入System.Web.dll的情况下执行此操作,而System.Web.dll不是Client Pofile的一部分?

Tod*_*her 309

System.Uri.EscapeUriString() 对于某些字符可能有问题,对我而言,字符串中有一个数字/磅'#'符号.

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

System.Uri.EscapeDataString() //Works excellent with individual values
Run Code Online (Sandbox Code Playgroud)

这是一个解答差异的SO问题答案:

EscapeUriString和EscapeDataString有什么区别?

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

  • 那博客文章有点陈旧,我只是"Uri Escaped"一个完整的网址,所有空间都变成了%20,所以我认为他们修复了它.我正在使用.Net 4.5. (7认同)

Thy*_*ine 245

在.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));
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

在.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

请随意编辑它并在我的测试字符串中添加新字符,或将它们留在评论中,然后我将对其进行编辑.

  • WebUtility.UrlEncode()和WebUtility.UrlDecode()是4.5+.它们在4.0中不存在. (3认同)

Mat*_*ela 53

您可以使用

Uri.EscapeUriString(见http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx)

  • @MatthewManela我很确定你的Oct1评论应该读*EscapeDataString会尝试编码...* (5认同)
  • 你想使用EscapeUriString.EscapeUriString将尝试编码整个URL(包括http:// part),而EscapeUriString了解实际应该编码的部分 (3认同)

Elm*_*mue 19

这里的答案非常好,但对我来说仍然不够.

我写了一个小循环,Uri.EscapeUriStringUri.EscapeDataString0到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"
.....
Run Code Online (Sandbox Code Playgroud)

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


Spr*_*gue 16

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

WebUtility

  • 看起来UrlEncode和UrlDecode仅添加到4.5版.Net中的WebUtility中. (11认同)

Dar*_*rov 8

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

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