js编码、解码方法(escape,encodeURI,encodeURIComponent区别及用法)

前言:

js解码、编码问题问题

escape()

  定义和用法:

  escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。

 该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。

提示: 使用 unescape() 方法对字符串进行解码。

语法

escape(string)

参数描述
string必需。要被转义或编码的字符串。

示例:

let str="Need tips? Visit RUNOOB!";
console.log(escape(str)) //Need%20tips%3F%20Visit%20RUNOOB%21
console.log(unescape(str)) //Need tips? Visit RUNOOB!

使用场景 :

这个实际上很少使用,而且不久的将来可能会被废弃。

encodeURI()

定义和用法

encodeURI() 函数可把字符串作为 URI 进行编码。

对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的: , / ? : @ & = + $ # (可以使用 encodeURIComponent() 方法分别对特殊含义的 ASCII 标点符号进行编码。).

提示:使用 decodeURI() 方法可以解码URI(通用资源标识符:UniformResourceIdentifier,简称"URI")。

语法

encodeURI(uri)

参数描述
uri必需。一个字符串,含有 URI 或其他要编码的文本。

示例: 

let str = "http://www.example.org/a file with spaces.html";
console.log(encodeURI(str),decodeURI(str));//http://www.example.org/a%20file%20with%20spaces.html

encodeURIComponent()

定义和用法

encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。

decodeURIComponent()进行解码。

语法

encodeURIComponent(uri)

参数描述
uri必需。一个字符串,含有 URI 组件或其他要编码的文本。

示例: 

 let str = "http://www.example.org/a file with spaces.html";
 console.log(encodeURIComponent(str),decodeURIComponent(str));//编码结果http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。

因此,"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。

API参考于菜鸟教程:

encodeURIComponent()encodeURI()escape()

本文部分内容参考于:

关于URL编码

escape()encodeURI()encodeURIComponent()的区别以及它们适用的场景的对比表格 :

escape()encodeURI()encodeURIComponent()
编码范围仅可识别 ASCII 字符集不包括特殊字符 #包括所有特殊字符
适用URL不适用用于编码整个URL用于编码URL中的参数部分
保留字符保留字符不会被编码保留字符如 :/?#[]@ 不会被编码所有非字母数字字符都会被编码
编码结果对特殊字符使用 % 编码%20 用于空格%20 用于空格; %21 用于 ! 等特殊字符
解码使用unescape()解码使用decodeURI()解码使用decodeURIComponent()解码
适用场景适用于旧版浏览器或特定需求(性能较差)编码整个URL(包含协议、域名、路径等)以防止URL被解释错误编码URL中的参数部分,确保可传递特殊字符

总结:

  • escape()适用于旧版浏览器或特定需求,它仅可识别ASCII字符集,并使用%编码特殊字符。在现代浏览器中,推荐使用encodeURIComponent()代替。
  • encodeURI()主要用于对整个URL进行编码,它不会编码特殊字符#,保留URL的结构和语义。
  • encodeURIComponent()主要用于编码URL中的参数部分,它会对所有非字母数字字符进行编码,保留字符都会被编码,适合用于参数传递。
  • 在解码时,通过unescape()解码escape()编码的内容,通过decodeURI()解码encodeURI()编码的内容,通过decodeURIComponent()解码encodeURIComponent()编码的内容。 请根据具体的使用场景选择合适的编码方法。请注意,由于escape()在性能方面表现较差且不适用于所有场景,建议使用encodeURI()encodeURIComponent()代替。

URI和URL的区别比较与理解:

URI (Uniform Resource Identifier)URL (Uniform Resource Locator)
定义和用途用于标识和定位资源用于定位和访问资源
组成和示例scheme:[//authority]path[?query][#fragment]scheme:[//authority]path[?query]
样例tel:+1234567890https://www.example.com/index.html?id=12345
场景用于标识任何类型的资源,例如电话号码、邮件地址等用于定位和访问互联网上的网页、文件、图片等
用途用于标识和唯一定位资源用于确定如何访问和获取资源
主要优点- 定义了统一的资源标识方法- 具体指定了如何访问和获取资源
- 可以包含多种类型资源- 可以直接打开或传递给网络客户端
- 灵活性高,可用于各种场景和技术- 直观并且清楚地指定了资源的位置
主要缺点- URI本身没有定义如何访问资源- 与特定协议绑定,如果协议不受支持则无法访问资源
- 可能需要额外的协议或标准来处理资源访问- 当所指定的资源位置发生变化时,指定的URL可能不再有效

总结: 

  • URI是统一资源标识符,用于标识和定位各种类型的资源,可以包含多种类型资源。
  • URL是统一资源定位符,用于定位和访问互联网上的网页、文件、图片等资源。
  • URI是一个更广泛的概念,包含了URL
  • URI主要优点是定义了统一的资源标识方法,灵活性高,可应用于各种场景和技术。而URL的主要优点是直观并且清楚地指定了资源的位置,可以直接打开或传递给网络客户端。
  • URI的主要缺点是本身没有定义如何访问资源,可能需要额外的协议或标准来处理资源访问。而URL的主要缺点是与特定协议绑定,如果协议不受支持,则无法访问资源,并且当所指定的资源位置发生变化时,指定的URL可能不再有效。 根据具体的场景和需求,选择合适的资源标识方法,可以使用URI来标识和唯一定位资源,使用URL来确定如何访问和获取资源。

可以解决的问题

项目中url中有+号会被变成空格(不止加号其他特殊字符也无法正常传参)。

1.本来是这样的admin++++88889977然而传参却变成了空格

用encodeURIComponent(logincode) 就行了。不能用encodeURI()。

2. logincode = logincode.replace(/\+/g, “+”);     

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

崽崽的谷雨

漫漫前端路,摸爬滚打

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值