为了账号安全,请及时绑定邮箱和手机立即绑定

关于请求主体是否要用encodeURIComponent()来编译

老师的课很不错,非常容易懂。不过我之前看《JavaScript权威指南》这本书中的http请求这部分内容时,它说在编辑post请求主体时,要将表单的数据编码,还用到了encodeURIComponent()这样的方法,好像是要转化成一种更复杂的字符串。但我看老师做的post请求的请求主体就只是把名值对用‘&’拼在一起,这是怎么回事啊?哪会前辈回答一下。谢谢。

正在回答

1 回答

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:黑猫
链接: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 一样)。


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Ajax全接触
  • 参与学习       224850    人
  • 解答问题       663    个

本课程通过一个案例,讲解Ajax的相关概念原理实现方式和应用

进入课程

关于请求主体是否要用encodeURIComponent()来编译

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信