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 许可协议
encodeURIComponent
转义除以下字符以外的所有字符:If you wish to use an encoding compatible with RFC 3986 (which reserves
!
,'
,(
,)
, and*
),您可以使用:您可以 在 MDN 上 获得更多相关信息。
更新:
要回答你的问题,关于为什么
'
和上面提到的其他字符不是由 encodeURIComponent 编码的,简短的回答是它们只需要在某些 URI 方案中编码,编码它们的决定取决于你正在使用的方案。引用 RFC 3986 :
其中“保留集”定义为
撇号在
sub-delims
组中。换句话说,如果您确定使用这些字符的应用程序知道如何处理它们,则必须特别保留这些字符未编码:例如,如果您错误地编码了?
和&
它们将不会更长的分隔查询部分。历史上也有人提议用;
和,
分隔的路径段参数(没有得到广泛采用),所以这些字符也仍然被允许。并不是说撇号在 URI 数据中“可以免费使用”(即unreserved
),而是假定它在 URI 上下文中具有一些特殊含义,例如segment
部分: