【问题标题】:ASP.Net URLEncode Ampersand for use in Query StringASP.Net URLEncode & 用于查询字符串
【发布时间】:2016-07-19 17:21:06
【问题描述】:

我需要重定向到一个将参数作为查询字符串传递的 url。

这可以在值中包含与号。比如

string value = "This & That";
Response.Redirect("http://www.example.com/?Value=" + Server.UrlEncode(value));

然而这会返回http://www.example.com/?Value=This+&+That

我应该用什么来编码这个字符串?

编辑: 感谢 Luke 指出了这一点,代码确实可以正常工作。抱歉,我的问题毕竟不是一个有效的问题!

我将要访问的页面有很多旧的遗留代码,这些代码显然在进行某种编码和解码,使其看起来好像我的 urlencode 不起作用。

不幸的是,我的解决方案是完全放弃使用 &,直到可以重新编写有问题的代码。难道你只是讨厌旧代码!

【问题讨论】:

    标签: c# asp.net query-string


    【解决方案1】:

    技术上做:

    value = value.Replace("&", "%26") 
    

    会成功的。

    编辑:整个 UrlEncode/HttpEncode 方法似乎存在一些棘手的问题,这些问题并不能完全解决问题。不久前我写了一个简单的方法,可能会派上用场。这应该涵盖所有主要的编码问题,并且也很容易编写“消毒剂”。

    Protected Function SanitizeURLString(ByVal RawURLParameter As String) As String
    
          Dim Results As String
    
          Results = RawURLParameter    
    
          Results = Results.Replace("%", "%25")
          Results = Results.Replace("<", "%3C")
          Results = Results.Replace(">", "%3E")
          Results = Results.Replace("#", "%23")
          Results = Results.Replace("{", "%7B")
          Results = Results.Replace("}", "%7D")
          Results = Results.Replace("|", "%7C")
          Results = Results.Replace("\", "%5C")
          Results = Results.Replace("^", "%5E")
          Results = Results.Replace("~", "%7E")
          Results = Results.Replace("[", "%5B")
          Results = Results.Replace("]", "%5D")
          Results = Results.Replace("`", "%60")
          Results = Results.Replace(";", "%3B")
          Results = Results.Replace("/", "%2F")
          Results = Results.Replace("?", "%3F")
          Results = Results.Replace(":", "%3A")
          Results = Results.Replace("@", "%40")
          Results = Results.Replace("=", "%3D")
          Results = Results.Replace("&", "%26")
          Results = Results.Replace("$", "%24")
    
          Return Results
    
    End Function
    

    【讨论】:

    • 同意。 “&”是 URL 中的保留字符,因此不会进行 URL 编码。
    • 从技术上讲,您只需要“清理”正斜杠、& 和问号。 URLEncode 将完成剩下的工作。
    • 出于某种原因,我认为必须将空格重新编码为 %20 而不是 +,或者它可以采用哪种方式?
    • @Dillie-O,推荐的空格编码现在是“%20”,但历史上使用的是“+”(有关更多信息,请参阅tools.ietf.org/html/rfc1630 的第 7 页)。几乎所有浏览器/服务器等都将处理这两种编码,尽管我不知道为什么 .NET 仍然使用过时的“+”。
    • 不会将 Results = Results.Replace("%", "%25") 搞砸上面的那些。
    【解决方案2】:

    documentation 建议 Server.UrlEncode 应该正确处理 & 符号。

    我刚刚测试了您的确切代码,返回的字符串编码正确:

    http://www.example.com/?Value=This+%26+That

    【讨论】:

    • 你完全正确!我正在使用的页面将有很多旧的遗留代码,这些代码本身正在做某种编码和解码,使它看起来好像我的 urlencode 不起作用。这工作正常..应该!
    • 在没有Server变量的情况下,也可以通过System.Web.HttpUtility访问urlencode/urldecode方法
    • 其他访问此页面的人的注意事项;如果您不在 ASP 应用程序中(因此无法访问Server),您可以使用System.Web.HttpUtility.UrlEncode
    • 还要注意Server.UrlEncodeSystem.Web.HttpUtility.UrlEncodeSystem.Uri.EscapeDataStringSystem.Uri.EscapeUriString 不同意如何编码。不要期望它们具有相同的输出,并且在尝试比较或解码事物时要小心,尤其是在涉及特殊字符时。
    【解决方案3】:

    另一个需要转义的字符是撇号。将其替换为 %27。

    string url = Server.UrlEncode(value).Replace("'", "%27);

    HttpUtility.UrlEncode() 和 Server.UrlEncode() 不会与其他几个字符一起替换此字符,以便与其他 .Net 框架向后兼容。详情见这篇微软文章:http://connect.microsoft.com/VisualStudio/feedback/details/214349/httputility-urlencode-does-not-encode-apostrophe

    【讨论】:

      【解决方案4】:

      如果查询字符串中有多个参数,这是正确的。

      例如:&firstname=bob&secondName="Tracy and John"

      【讨论】:

        【解决方案5】:

        如果您从 GridView 获取值,&amp; ampersand 很可能会显示为 "&amp;amp;"

        row.Cells[4].Text.ToString() = xxxx&amp;
        

        所以在这种情况下你会想要使用:

        .Replace("&amp;", "%26")
        

        【讨论】:

          【解决方案6】:

          您必须使用Server.UrlEncode(string containing the ampersand)

          我刚刚测试了一下,返回的查询字符串被正确编码然后解码。

          HttpUtility 不适用于此操作。

          【讨论】:

            【解决方案7】:

            在 .net core 2.1 版(2018 年末)中,我能够使用以下内容:

            System.Web.HttpUtility.UrlEncode(string_to_encode)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-02
              • 1970-01-01
              • 2018-06-16
              相关资源
              最近更新 更多