为什么 encodeURIComponent 不对单引号/撇号进行编码?

新手上路,请多包涵

escape() 函数已被弃用并被 encodeURIComponent 取代,但 encodeURIComponent 不对单引号/撇号字符进行编码。我需要以 AJAX 形式转义人姓氏(例如“O’Neill”)中的撇号。他们为什么要删除他们试图改进的东西的能力?

编辑:

所以这里有一个代码示例来更彻底地解释问题。因此,正如您所见,姓氏“O’Neill”包含一个撇号,在 url 中传递变量时需要将其转义。但这也会发生在表单的其他地方,例如,如果输入的地址是“Billy’s Tavern”。

 <input id='surname' value="O'Neill">
<script>
var get_url = '?surname='+encodeURIComponent($('#surname').val());
$.ajax({
    url: get_url
});
</script>

我当前的解决方案,使用自定义函数。我的问题只是问为什么需要自定义函数。

 <script>
function customEncodeURIComponent(URI) {
    return encodeURIComponent(URI).replace(/'/g, "%27");
}
</script>

<input id='surname' value="O'Neill">
<script>
var get_url = '?surname='+customEncodeURIComponent($('#surname').val());
$.ajax({
    url: get_url
});
</script>

原文由 Con Tully 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 907
2 个回答

encodeURIComponent 转义除以下字符以外的所有字符:

字母,十进制数字,- _ 。 ! 〜*‘()

If you wish to use an encoding compatible with RFC 3986 (which reserves ! , ' , ( , ) , and * ),您可以使用:

 function rfc3986EncodeURIComponent (str) {
    return encodeURIComponent(str).replace(/[!'()*]/g, escape);
}

您可以 在 MDN 上 获得更多相关信息。

更新:

要回答你的问题,关于为什么 ' 和上面提到的其他字符不是由 encodeURIComponent 编码的,简短的回答是它们只需要在某些 URI 方案中编码,编码它们的决定取决于你正在使用的方案。

引用 RFC 3986

生成 URI 的应用程序应对与 reserved set 中的字符相对应的数据八位字节进行百分比编码,除非 URI 方案特别允许这些字符表示该组件中的数据。如果在 URI 组件中发现保留字符,并且不知道该字符的定界角色,则必须将其解释为表示对应于该字符在 US-ASCII 中的编码的数据八位字节。

其中“保留集”定义为

reserved    = gen-delims / sub-delims
gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
            / "*" / "+" / "," / ";" / "="

撇号在 sub-delims 组中。换句话说,如果您确定使用这些字符的应用程序知道如何处理它们,则必须特别保留这些字符未编码:例如,如果您错误地编码了 ?& 它们将不会更长的分隔查询部分。历史上也有人提议用 ;, 分隔的路径段参数(没有得到广泛采用),所以这些字符也仍然被允许。并不是说撇号在 URI 数据中“可以免费使用”(即 unreserved ),而是假定它在 URI 上下文中具有一些特殊含义,例如 segment 部分:

 segment       = *pchar
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"

原文由 dcro 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试这个

encodeURIComponent(str).replace(/'/g, "%27");

/char/g 语法告诉 JavaScript 替换字符串中所有出现的地方

原文由 Amith 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题