一文助你分清encodeURI与encodeURIComponent

简介: 帮助你区别 encodeURI 与 encodeURIComponent 的使用场景

背景

最近在公司做预览功能时,遇到对请求参数进行编码的场景。那么问题来了:

  • 为什么要对链接或参数进行编码?
  • 何时需要编码?
  • encodeURI 与 encodeURIComponent 有啥区别呢?

下面来一起看看吧~

为啥需要编码

Http 协议中参数的传输是"key=value"这种键值对形式的,如果要传多个参数就需要用"&"符号对键值对进行分割。如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用"&"分割出每一个参数,然后再用"="来分割出参数值。

URL 是采用 ASCII 字符集进行编码的,根据 RFC3986 "%编码" 规范:"&"会被编码为"26","="会被编码为"3D"。

如果参数值中包含"="或"&"这种特殊字符会产生歧义,因为 URL 编码只是简单的在特殊字符的各个字节前加上%,所以需要对参数进行 URL 编码。

如果需要传输的参数可能包含类似"(!$&'()*+,;=)"这种特殊字符时就需要进行编码了。

下面来看看标题所说的两种编码方式。

我们注意到两种方式都包含一个 URI,那么 URI 是啥?

统一资源标识符(Uniform Resource Identifier,URI)是一个用于标识某一互联网资源名称的字符串。
Web 上可用的每种资源 -HTML 文档、图像、视频片段、程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。

encodeURI

用作对一个完整的 URI 进行编码,不会对网址中的 ASCII 字母和数字及标点符号进行编码。

  • !#$&'()*+,/:;=?@-.\_~0-9a-zA-Z 不会被编码

使用场景
当需要获取一个可用的 URL 地址时,使用此方法进行编码。

例子:

encodeURI('http://xuedingmiao.com/My first/');
// http://xuedingmiao.com/My%20first/

encodeURIComponent

是对统一资源标识符(URI)的组成部分进行编码的方法,从字面意思来看 URIComponent 是 URL 组成部分、组件,所以这个方法是对组成部分进行编码而不是整体。

encodeURIComponent 会假定它的参数是 URI 的一部分(比如协议、主机名、路径或查询字符串),在 encodeURI 中不被编码的符号"; / ? : @ & = + $ , #",encodeURIComponent 都会进行编码。

  • !'()*-.\_~0-9a-zA-Z 不会被编码

使用场景
当需要对 URL 的参数进行编码时,使用 encodeURIComponent。

例子:

encodeURIComponent('http://xuedingmiao.com/?a=1&b=2');
// "http%3A%2F%2Fxuedingmiao.com%2F%3Fa%3D1%26b%3D2"

区别总结

编码方式 适用场景 安全字符
encodeURI 对完整 URI 编码 82 个:!#$&'()*+,/:;=?@-.\_~0-9a-zA-Z
encodeURIComponent 对 URI 组件编码 71 个:!'()*-.\_~0-9a-zA-Z
  • 可以看到 encodeURIComponent 编码的字符范围比 encodeURI 的大

参考资料

相关文章
|
8月前
|
前端开发
[牛客网-前端大挑战QD2] 获取url参数
[牛客网-前端大挑战QD2] 获取url参数
62 0
|
5月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
80 1
|
6月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
151 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
数据采集 XML 编解码
正则表达式学废了?xpath来救!
正则表达式学废了?xpath来救!
87 0
|
8月前
|
安全 JavaScript 前端开发
escape, encodeURI, encodeURIComponent 有什么区别以及作用?
escape, encodeURI, encodeURIComponent 有什么区别以及作用?
342 0
|
前端开发
[牛客网-前端大挑战QD2] 获取url参数
[牛客网-前端大挑战QD2] 获取url参数
58 0
|
前端开发
#yyds干货盘点# 歌谣学前端之变量
#yyds干货盘点# 歌谣学前端之变量
52 0
|
前端开发
#yyds干货盘点# 歌谣学前端之解构赋值
#yyds干货盘点# 歌谣学前端之解构赋值
58 0
|
前端开发
#yyds干货盘点# 歌谣学前端之变量
#yyds干货盘点# 歌谣学前端之变量
69 0
|
前端开发
#yyds干货盘点# 歌谣学前端之解构赋值
#yyds干货盘点# 歌谣学前端之解构赋值
68 0