41

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

5 回答 5

61

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

segment       = *pchar
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
于 2013-08-15T11:26:26.460 回答
11

尝试这个

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

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

于 2013-08-15T11:08:31.433 回答
1

最近的答案 (2021)

使用 JavaScript 的URLSearchParams

console.log(new URLSearchParams({ surname: "O'Neill" }).toString())

// or

console.log(new URLSearchParams("surname=O'Neill").toString())

于 2021-12-10T18:04:41.297 回答
0

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

var replaceChars={ '\\':'\\\\' , '"':'\\"' };
encodeURIComponent(str.replace(/\\|"/gi, function(matched){
    return replaceChars[matched];
})),
于 2016-01-28T08:29:28.433 回答
-3

这对我有帮助:

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

%60 是 ` ,但以某种方式定义为单引号。

于 2016-12-24T22:03:16.983 回答