在 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:
链接时也很有帮助,因为您需要对 body
和 subject
参数进行编码以保持换行符、& 符号等完好无损。
当保留集中的字符(“保留字符”)具有 特定上下文中的特殊含义(“保留的目的”)和 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¶m2="+encodeURIComponent('Dolce & Gabbana') OR
var someValue = 'Dolce & Gabbana';
data : "param1=getAccNos¶m2="+encodeURIComponent(someValue)
https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/encodeURIComponent
【讨论】:
以上是关于在 URL 中转义 & 符号的主要内容,如果未能解决你的问题,请参考以下文章
需要在 .htaccess 重写规则中转义 # (hash/pound) 字符