encodeURI 和encodeURIComponent
encodeURI
encodeURI 将除以下字符之外的所有字符替换为 UTF-8 转义序列:
类型 | 包含 |
---|---|
保留字符 | ; , / ? : @ & = + $ |
非转义字符 | a-zA-Z0-9 - _ . ! ~ * ' ( ) |
数字符号 | # |
warning:如果 URL 需要遵循较新的RFC3986标准,那么方括号是被保留的 (给 IPv6),因此对于那些没有被编码的 URL 部分 (例如主机),可以使用下面的代码
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, "[").replace(/%5D/g, "]");
}
结论:encodeURI()通常用于转码整个 URL,不会对URL 元字符以及语义字符进行转码
encodeURIComponent
encodeURIComponent 转义除了如下所示外的所有字符:
不转义的字符:
A-Z a-z 0-9 - _ . ! ~ * ' ( )
与 encodeURI() 相比,此函数会编码更多的字符,包括 URI 语法的一部分。
通常encodeURIComponent 只用于转义URI的组成部分,如?后带参数的部分等。
注:若整个链接被encodeURIComponent()转码,则该链接无法被浏览器访问,需要解码之后才可以正常访问。
// Encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent('test?')}`);
// Expected output: "?x=test%3F"