encodeURIComponent
转义除以下字符外的所有字符:
字母,十进制数字-_。!?*’()
如果您希望使用兼容的编码与RFC 3986(其中储备!
,'
,(
,)
,和*
),您可以使用:
function rfc3986EncodeURIComponent (str) {
return encodeURIComponent(str).replace(/[!'()*]/g, escape);
}
要回答您的问题,关于为什么'
上面提到的其他字符以及为什么不是由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 / "-" / "." / "_" / "~"