【问题标题】:Escaping ampersand in URL在 URL 中转义 & 符号
【发布时间】:2013-05-13 09:59:38
【问题描述】:

我正在尝试发送一个 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"; message = [message stringByReplacingOccurrencesOfString:@"&" withString:@"%26"]; message = [message stringByAppendingString:@" "]; message = [message stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
    【解决方案2】:

    仅适用于 URL 中的 & 符号,而是适用于所有 reserved characters。其中包括:

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

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

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

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

    【讨论】:

    • 以上列表中,! ' ( ) * 不是使用encodeURIComponent 编码的URL。
    • 有一个 php 函数 urlencode 可以解决这个问题:usage $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

              【讨论】:

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