escape,encodeURI,encodeURIComponent有什么区别?

哪位大侠给个escape,encodeURI,encodeURIComponent的详细区别.最好能说一下各自的应用场合。
关注者
149
被浏览
15649

8 个回答

在这个页面里面试着搜了一下 「UTF-8」 ,居然没有搜到。

escape 和 encodeURI 都属于 Percent-encoding,基本功能都是把 URI 非法字符转化成合法字符,转化后形式类似「%*」。它们的根本区别在于,
escape 在处理 0xff 之外字符的时候,是直接使用字符的 unicode 在前面加上一个 「%u」,而encodeURI则是先进行 UTF-8,再在 UTF-8 的每个字节码前加上一个 「%」;
在处理 0xff 以内字符时,编码方式是一样的(都是「%XX」,XX为字符的 16 进制 unicode,同时也是字符的 UTF-8),只是范围(即哪些字符编码哪些字符不编码)不一样。(杨易提醒)
encodeURI 是W3C 的标准,而 Escape 是非标准。

举一个例子:
知乎的「知」字,可以知道它的 unicode 为 0x77e5,对它进行 UTF-8 编码,变成了三个字节:0xe7, 0x9f, 0xa5
因此,如果是使用 escape 编码「知」,得到的结果就是 「%u77E5」;encodeURI 得到的结果则是 「%E7%9F%A5」

Escape 的编码有一个弊端在于,它后面是 4 位 16 进制,故不支持基本多文种平面(BMP)外的字符(unicode 大于 0xffff)的字符;
而 encodeURI 是基于 UTF-8 的,编码本身理论上可以支持 0x10ffff 内的字符(实际上现在的 JavaScript 不支持 BMP 外的字符,所以 encodeURI 也不支持 )。

encodeURI 和 encodeURIComponent 的区别在于需要转义的字符范围不一样,参考 @黄家兴 的答案。
使用场景方面,也可以可以参考他的答案,但是不同意这一句:
如果只是编码字符串,不和URL有半毛钱关系,那么用escape。
encodeURI(Component) 一般用在 URI 上,但是不是一定就要用在 URL 上。比如如果 POST 请求的 Request Header 中 Content-Type 为「application/x-www-form-urlencoded」, 那么 Request Payload 里面的数据一般就是使用 encodeURI(Component) 编码的。(和 URL 的 querystring 一样)。

如果没有必要,不要使用 escape。

参考资料:Percent-encoding
如果你要操作 URI,你就忘掉 escape 吧,这是个不相关的函数。接下来 encodeURI 和 encodeURIComponent 两个名字已经说得很清楚了。encodeURI 是用来处理整个 URI 的,它应该接受 URI 的 protocol, host, port 等部分,只对 path 和 query 进行编码。而 encodeURIComponent 是用来编码你准备用作 query 一部分的字符串的。
为什么?