关于请求主体是否要用encodeURIComponent()来编译
老师的课很不错,非常容易懂。不过我之前看《JavaScript权威指南》这本书中的http请求这部分内容时,它说在编辑post请求主体时,要将表单的数据编码,还用到了encodeURIComponent()这样的方法,好像是要转化成一种更复杂的字符串。但我看老师做的post请求的请求主体就只是把名值对用‘&’拼在一起,这是怎么回事啊?哪会前辈回答一下。谢谢。
老师的课很不错,非常容易懂。不过我之前看《JavaScript权威指南》这本书中的http请求这部分内容时,它说在编辑post请求主体时,要将表单的数据编码,还用到了encodeURIComponent()这样的方法,好像是要转化成一种更复杂的字符串。但我看老师做的post请求的请求主体就只是把名值对用‘&’拼在一起,这是怎么回事啊?哪会前辈回答一下。谢谢。
2015-09-23
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:黑猫
链接:https://www.zhihu.com/question/21861899/answer/43480575
来源:知乎
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 一样)。
举报