一张图看懂encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别

本文深入解析了URI编码与解码的四个核心函数:encodeURI、encodeURIComponent、decodeURI和decodeURIComponent,阐述了它们在处理互联网资源标识符时的差异与应用,以及如何正确使用这些函数避免URI组件的误译。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、这四个方法的用处

1、用来编码和解码URI的

统一资源标识符,或叫做 URI,是用来标识互联网上的资源(例如,网页或文件)和怎样访问这些资源的传输协议(例如,HTTP 或 FTP)的字符串。除了encodeURI、encodeURIComponent、decodeURI、decodeURIComponent四个用来编码和解码 URI 的函数之外 ECMAScript 语言自身不提供任何使用 URL 的支持。

2、URI组成形式

一个 URI 是由组件分隔符分割的组件序列组成。其一般形式是:

Scheme : First / Second ; Third ? Fourth

其中斜体的名字代表组件;“:”, “/”, “;”,“?”是当作分隔符的保留字符

3、有和不同?

encodeURI 和 decodeURI 函数操作的是完整的 URI;这俩函数假定 URI 中的任何保留字符都有特殊意义,所有不会编码它们。

encodeURIComponent 和 decodeURIComponent 函数操作的是组成 URI 的个别组件;这俩函数假定任何保留字符都代表普通文本,所以必须编码它们,所以它们(保留字符)出现在一个完整 URI 的组件里面时不会被解释成保留字符了。

以上说明摘自ECMAScript标准,为了容易读懂做了点编辑加工。

4、图解四个函数的不同:

ECMA对这四个函数还做了详细解释,可能是为了写的更逻辑化一些,采用了类似变量配合逻辑的写法来说明,但是让初学者看得云里雾里的特别绕,所以有必要把它写得更像是人读的东西……

 图解转义与反转义URI的四种方法

当 URI 里包含一个没在上面列出的字符或有时不想让给定的保留字符有特殊意义,那么必须编码这个字符。字符被转换成 UTF-8 编码,首先从 UT​​F-16 转换成相应的代码点值的替代。然后返回的字节序列转换为一个字符串,每个字节用一个“%xx”形式的转移序列表示。(具体转换规则可以参考抽象操作EncodeDecode的说明

在Java中,`encodeURI()`、`encodeURIComponent()`、`decodeURI()` 和 `decodeURIComponent()` 都是用于处理URL编码和解码的内置函数,它们主要用于字符串转换,以便在HTTP请求头、URL路径、查询参数等需要统一格式的地方。 1. `encodeURI()` 函数:这个方法会将输入的URI(Uniform Resource Identifier)字符串按照规范进行编码,包括空格和其他非ASCII字符,适用于整个URI的编码,不会对已经编码的部分再次编码。例如: ```java String encoded = URLEncoder.encode("Hello World!", "UTF-8"); ``` 2. `encodeURIComponent()` 函数(注意这是JavaScript中的函数,不是Java标准库的一部分):它更专注于URL查询参数部分的编码,对于特殊字符如"!"、"*"、"&"等采用百分号%加上对应的十六进制数的方式编码。如果需要在Java中实现类似功能,可以使用`URLEncoder`结合`String`的`replace()`方法: ```java String encodedQuery = "Hello%20World!".replaceAll("[^a-zA-Z0-9\\-._~:/?#]", "%$0".charAt(0)); ``` 3. `decodeURI()` 函数:接收编码后的URI字符串并将其还原成原始形式。比如: ```java String decoded = URLDecoder.decode(encoded, "UTF-8"); ``` 4. `decodeURIComponent()` 函数:同样地,它用于解码URIComponent编码的数据。例子: ```java String decodedParam = URLDecoder.decode(encodedQuery, "UTF-8"); ``` 在实际应用中,如果你在构建URL、发送网络请求或者处理用户输入时遇到编码和解码的需求,就需要用到这些方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值