前言:
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()
本文部分内容参考于:
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:+1234567890 | https://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, “+”);