在 URL 中转义 & 符号

Posted

技术标签:

【中文标题】在 URL 中转义 & 符号【英文标题】:Escaping ampersand in 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,所以我只需要正确的字符。

我不能使用任何库。怎么办?

【问题讨论】:

【参考方案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%20***%3F(http%3A%2F%2Fwww.***.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

【讨论】:

以上是关于在 URL 中转义 & 符号的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 字符串中转义 & 字符

如何在 URL 中转义哈希字符

需要在 .htaccess 重写规则中转义 # (hash/pound) 字符

如何在 XML 中转义 & 符号,以便将它们呈现为 HTML 中的实体?

有没有办法在 xml 中转义 CDATA 结束令牌?

在JAX-RS中的查询参数中转义`%`符号