前端开发中,我们经常在请求路径中带各种参数,但细心的你会发现,在浏览器的路径栏看到的地址跟自己输入的参数不一样,浏览器将自己的输入转换成了一串字符。
这其中涉及到 encodeURI、encodeURIComponent、decodeURI、decodeURIComponent(escape和unescape已被弃用)。
encodeURI 和 decodeURI
encodeURI(uri)
- 参数:uri一个包含URI或其他待编码的文本的字符串
- 返回:uri的一个副本,其中某些字符已被替换为十六进制转义序列。
ASCII 字母和数字以及下面的ASCII标点字符将不会编码:-_.!~*’() ;/?:@&=+$,#
uri中的其他字符将被转换为对应的 UTF-8 编码,并将结果的一、二或三个字节编码为一个 %xx
格式的十六进制转义序列。在这种编码机制中,ASCII字符将被替换为一个单独的%xx
转义序列,编码在 \uoo8o ~ \uo7ff 之间的字符将被替换为两个转义序列,其他所有的十六位的Unicode字符则将被替换为三个转义序列。
使用这个方法来编码URI时,必须确保该URI的组件(如查询字符串)都不包含如“?”和“#”等的URI分隔字符。如果这些组件必须包含这类字符,则应该使用encodeURIComponent()来对每个组件进行 单独编码 。
decodeURI()是这个方法的逆方法。
encodeURIComponent 和 decodeURIComponent
encodeURIComponent(s)
- 参数s:一个包含URI一部分或其他待编码文本的字符串。
- 返回:s的一个副本,某些字符已替换为十六进制转义序列。
ASCII字母和数字以及下面这些ASCII标点字符将不会编码:-_.!~*’(),所有其他字符,包括“/”、“:”以及“#”等用于分隔URI的多个组件的标点字符,都将被替换为一个或多个十六进制的转义序列。
encodeURIComponent() 和 encodeURI() 之间的差别
- encodeURIComponent()假设它的参数是URI的一部分(如协议、主机名、路径或查询字符串)。因此,它将那些用于分隔URI不同部分的标点字符(/:#)也转义了。
- encodeURI方法 不会 对下列字符编码:ASCII字母、数字、~!@#$&*()=:/,;?+’
- encodeURIComponent方法 不会 对下列字符编码:ASCII字母、数字、~!*()’
最佳实践
- 如果需要编码整个 URL,然后需要使用这个 URL,那么用 encodeURI()
- 当你需要编码 URL 中的参数的时候,那么 encodeURIComponent() 是最佳的方法