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

时间:2013-08-15 11:04:36

标签: javascript ajax

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>

4 个答案:

答案 0 :(得分:43)

encodeURIComponent将转义除以下内容之外的所有字符:

  

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

如果您希望使用与RFC 3986兼容的编码(保留!'()*),可以使用:

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

您可以获得有关此on 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部分:< / p>

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

答案 1 :(得分:5)

试试这个

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

/char/g语法告诉JavaScript替换字符串中的所有匹配项

答案 2 :(得分:0)

我看到字符存在同样的问题:"\以便这对我有用:

var replaceChars={ '\\':'\\\\' , '"':'\\"' };
encodeURIComponent(str.replace(/\\|"/gi, function(matched){
    return replaceChars[matched];
})),

答案 3 :(得分:-1)

这有助于我:

replace(/'/g, '%60')

%60是`,但不知何故定义为单引号。