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>
答案 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是`,但不知何故定义为单引号。