8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

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

Tasos Papastylianou 2月前

68 0

我正在尝试编写一个调用网站获取数据的 Windows 客户端应用程序。为了将安装保持在最低限度,我尝试仅使用 .NET Framework 客户端配置文件中的 dll。问题是我...

我正在尝试编写一个调用网站获取数据的 Windows 客户端应用程序。为了将安装保持在最低限度,我尝试仅使用 .NET Framework Client Profile 中的 dll 。问题是我需要对某些参数进行 UrlEncode,有没有一种简单的方法可以做到这一点,而无需导入不属于 Client Pofile 的 System.Web.dll?

帖子版权声明 1、本帖标题:如何在不使用 System.Web 的情况下进行 UrlEncode?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Tasos Papastylianou在本站《xaml》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我使用的是 System.Net.WebRequest 对象。然后我调用 GetRequestStream 并将我的 Post 参数写入流中。我还将 ContentType 设置为 \'application/x-www-form-urlencoded\'。

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

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

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

    这是一个 SO 问题的答案,解释了其中的区别:

    EscapeUriString 和 EscapeDataString 有什么区别?

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

  • 错误:blogs.msdn.com/b/yangxind/archive/2006/11/09/… 您会遇到加号问题,因为它们不会被编码。

  • 那篇博客文章有点旧了,我刚刚有一个完整的 url \'Uri Escaped\',所有空格都变成了 %20,所以我认为他们已经修复了它。我使用的是 .Net 4.5。

  • 如果您正在为 POST 操作准备数据,EscapeDataString 也不支持非常长的字符串。.com/questions/6695208/...

  • 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 这似乎重复了
    Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
    注意: EscapeUriString 将保留有效的 uri 字符串,这会导致它使用尽可能多的纯文本字符。

    请参阅此答案以了解比较各种编码的表格:
    https://.com/a/11236038/555798

    换行符 此处列出的所有换行符(除 外 HttpUtility.HtmlEncode )都将转换 "\n\r" %0a%0d %0A%0D

    请随意编辑此内容并将新字符添加到我的测试字符串中,或​​者将它们留在评论中,然后我会对其进行编辑。

  • 在我的例子中,我必须使用 EscapeDataString 而不是 EscapeUriString,因为我们正在对回车符和换行符进行编码,而这些需要 EscapeDataString 执行更积极的转义

  • 更多示例,您可以根据需要提供自己的测试用例。以下是运行它和其他编码方法的示例,显示了差异 dotnetfiddle.net/12IFw1

  • WebUtility.UrlEncode() 和 WebUtility.UrlDecode() 是 4.5+ 版本。它们在 4.0 版本中不存在。

  • msdn 说:\'通用 Windows 平台:自 4.5 起可用,.NET Framework:自 4.0 起可用\'...

  • fl0w 2月前 0 只看Ta
    引用 14

    您想使用 EscapeUriString。EscapeUriString 将尝试对整个 URL(包括 http:// 部分)进行编码,而 EscapeUriString 知道实际上应该对哪些部分进行编码

  • 我明白了,所以在这种情况下我可能需要 EscapeDataString,因为我可能想要传递 URL 作为获取参数。在这个例子中,我正在附加到 URL。

  • 引用 16

    @MatthewManela 我很确定你的 Oct1 评论应该是 EscapeDataString 将尝试编码...

  • 不要使用 Uri.EscapeUriString。它无法“理解”哪些部分应该被编码,它只是一种误导性的尝试(转义完整的 URI),而这实际上是不可能始终如一地做到的。请参阅此答案以了解详细解释。

  • 引用 18

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

    我编写了一个小循环,比较 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。请参阅此答案以了解详细解释。

返回
作者最近主题: