您不应该使用encodeURIComponent()
或encodeURI()
。您应该根据MDN文档使用fixedEncodeURIComponent()
和fixedEncodeURI()
。
关于encodeURI()
...
如果有人希望遵循最新的URL RFC3986,这使得方括号保留(用于IPv6),因此在形成可能属于URL的内容(例如主机)时不进行方括号编码,以下代码段可能会有所帮助:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
关于encodeURIComponent()
...
为了更严格地遵守RFC 3986(保留!,',(,)和*),即使这些字符没有正式的URI分隔用法,也可以安全地使用以下字符:
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
那么区别是什么呢? fixedEncodeURI()
并fixedEncodeURIComponent()
转换相同的一组值,但fixedEncodeURIComponent()
也会转换此组:+@?=:*#;,$&
。此集用于GET
参数(&
,+
等),锚标记(#
),通配符标记(*
),电子邮件/用户名部分(@
)等。
例如-如果使用encodeURI()
,user@example.com/?email=me@home
则不会将第二个错误正确地发送@
到服务器,但浏览器会处理兼容性(Chrome经常会这样做)。