小编典典

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

ajax

逃生() 函数,已被废弃,取而代之 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>

阅读 758

收藏
2020-07-26

共1个答案

小编典典

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

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

如果您希望使用兼容的编码与RFC 3986(其中储备!'(),和*),您可以使用:

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组中。换句话说,如果您确定使用的应用程序会知道如何处理这些字符,则必须特别避免对这些字符进行编码:例如,如果您错误地编码?并且&它们将不再分隔查询部分。历史上也有建议使用;和分隔的路径段参数,(并没有被广泛采用),因此仍然允许使用这些字符。并不是说撇号unreserved在URI数据中是“免费使用”(即),而是假定它在URI上下文中将具有某些特殊含义,例如segment

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