【问题标题】:Escaping ampersand in URL转义 URL 中的符号
【发布时间】:2021-11-10 03:20:30
【问题描述】:

我正在尝试发送一条 GET 消息,其中包含带有 & 符号的字符串,但不知道如何转义 URL 中的 & 符号。

例子:

http://www.example.com?candy_name=M&M
result => candy_name = M

我也试过:

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

我手动使用 URL,所以我只需要正确的字符。

我不能使用任何库。怎么做到呢?

【问题讨论】:

    标签: http url get query-string query-parameters


    【解决方案1】:

    它们需要进行百分比编码:

    > encodeURIComponent('&')
    "%26"
    

    所以在你的例子中,URL 看起来像:

    http://www.mysite.com?candy_name=M%26M
    

    【讨论】:

    • :- %26 对我不起作用。还有其他解决方案吗?
    • 当我将 & 替换为 %26 时,它仍然显示相同的错误-- A potentially dangerous Request.Path value was detected from the client (&).
    • @Sanjiv:那是你的代码的问题,而不是百分比编码。问一个问题。
    • @Sanjiv 确保先将“&”替换为“%26”。见代码:: NSString *message = @"Hello Jack & Jill";消息 = [消息 stringByReplacingOccurrencesOfString:@"&" withString:@"%26"];消息 = [消息 stringByAppendingString:@" "];消息 = [消息 stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    • 这次真是万分感谢!为我省去了设置数据库连接 URI 变量的大量麻烦
    【解决方案2】:

    这不只申请到 URL 中的 & 符号,但到所有 reserved characters。其中一些包括:

     # $ & + ,  / : ; = ? @ [ ]
    

    这个想法与在 HTML 文档中编码 & 相同,但是除了在 HTML 文档中之外,上下文已更改为在 URI 中。因此,百分比编码可以防止在两个上下文中解析的问题。

    当您需要将一个 URL 放在另一个 URL 中时,它会派上用场。例如,如果您想在 Twitter 上发布状态:

    http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)
    

    我的推文中有很多保留字符,即 ?'():/,因此我对 status URL 参数的整个值进行了编码。这在使用具有邮件正文或主题的 mailto: 链接时也很有用,因为您需要对 bodysubject 参数进行编码以保持换行符、& 符号等的完整性。

    当保留集中的字符(“保留字符”)具有 特定上下文中的特殊含义(“保留目的”)和 URI 方案说有必要将该字符用于其他一些 purpose,那么这个字符必须是百分号编码的。百分比编码 保留字符涉及将字符转换为其 ASCII 中相应的字节值,然后将该值表示为 一对十六进制数字。数字,前面有百分号 ("%") 用作转义字符,然后在 URI 中使用 代替保留字符。 (对于非 ASCII 字符,它是 通常转换为 UTF-8 中的字节序列,然后每个字节 值表示如上。)保留字符“/”,用于 例如,如果在 URI 的“路径”组件中使用,则具有特殊的 作为路径段之间的分隔符的含义。如果,根据一个 给定 URI 方案,“/”需要在路径段中,那么三个 段中必须使用字符“%2F”或“%2f”,而不是原始字符 “/”。

    http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

    【讨论】:

    • 在上面的列表中,! ' ( ) * 不是使用 encodeURIComponent 编码的 URL。
    • 有一个 php 函数 urlencode 可以解决这个问题:用法 $escapedfilename=urlencode($filename);
    【解决方案3】:

    尝试使用http://www.example.org?candy_name=M%26M

    另请参阅this reference 和更多信息on Wikipedia

    【讨论】:

      【解决方案4】:

      您可以使用 % 字符来“转义”URL 中不允许的字符。参见RFC 1738

      the Wikipedia page 上给出了 ASCII 值表。

      你可以看到 & 是十六进制的 26 - 所以你需要 M%26M。

      【讨论】:

        【解决方案5】:

        我想对 Blender's solution 添加一个小评论。

        您可以执行以下操作:

        var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');
        

        输出:

        http://example.com?candy_name=M%26M
        

        最棒的是它不仅适用于&,而且适用于任何特殊角色。

        例如:

        var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')
        

        输出:

        "http://example.com?candy_name=M%26M%3F%3E%3C"
        

        【讨论】:

          【解决方案6】:

          如果有人想在 PHP 中使用它,这可能会有所帮助

          $variable ="candy_name=M&M";
          $variable = str_replace("&", "%26", $variable);
          

          【讨论】:

            【解决方案7】:

            如果您不能使用任何库来对值进行编码, http://www.urlencoder.org/http://www.urlencode-urldecode.com/或...

            只需输入您的值“M&M”,而不是完整的 URL ;-)

            【讨论】:

              【解决方案8】:

              您可以使用此 encodeURIComponent 函数传递参数,这样您就不必担心传递任何特殊字符。

              data: "param1=getAccNos&param2="+encodeURIComponent('Dolce & Gabbana') OR
              var someValue = 'Dolce & Gabbana';
              data : "param1=getAccNos&param2="+encodeURIComponent(someValue)
              

              https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-05-13
                • 2012-02-19
                • 1970-01-01
                • 2011-02-03
                • 2013-07-11
                • 2019-12-28
                相关资源
                最近更新 更多