python使用encodeurlcomponent方法_URI编解码详解encodeURIComponent、encodeURI

本文详细介绍了URI的概念及其组成部分,包括协议、主机名、查询参数和锚点。同时,对比了URI与URL的区别。重点讲解了在URI编码中常用的encodeURI和encodeURIComponent方法,分别阐述了它们的编码规则和应用场景,以及对应的解码方法decodeURI和decodeURIComponent。通过实例展示了如何正确处理URI中的特殊字符,确保URI的正确解析。

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

URI

URI是Universal Resource Identifier通用资源标志符,是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。

URI的初识

若干部分

协议/scheme name

类似 https、http、file、ed2k

主机名

这部分比较熟悉的是 //baidu.com 网络主机,也可能是其他的形式的资源:mailto:名称@域名 用户邮箱,

query/参数

类似a=1&b=2

标识符/锚点

有的URI指向的不是整个资源,而是某个资源的内部某个模块,这也是我们熟悉的锚点:https://baidu.com#test,这是指向资源内部的某一部分。

相对URI

有的时候请求的资源可能是相对当前资源的路径来完成的,logo 这样的,

整体的书写方式如下:

: [ ? ] [ # ]

例如:

file:///c:/WINDOWS/clock.avi

Git://github.com/user/project-name.git

ftp://user1:1234@地址

ed2k://|file|%5BMAC%E7%89%88%E6%9E%81%E5%93%81%E9%A3%9E%E8%BD%A69%EF%BC%9A%E6%9C%80%E9%AB%98%E9%80%9A%E7%BC%89%5D.%5BMACGAME%5DNeed.For.Speed.Most.Wanted.dmg|4096933888|2c55f0ad2cb7f6b296db94090b63e88e|h=ltcxuvnp24ufx25h2x7ugfaxfchjkwxa|/

这些都是一个URI Scheme。

其中:

:很明显,这是scheme的名称,对于上面五个scheme,它们scheme名分别是http,file, git, ftp, ed2k(电驴协议),实际上,它们也代表着协议名称。

:实际上,一般情况,它包含 authority 和 path【//baidu.com、///c:/WINDOWS/clock.avi】。

:可选项目,一般使用;隔开或&隔开的键值对=【a=1&b=2】

:可选项目包,其它额外的标识信息[#href#anchor]

和URL的不同

这URI和URL长得也很相似,URL是Uniform Resource Locator的缩写,译为“统一资源定位符”。格式类似

协议【http、https】://主机名【baidu.com】/具体地址【test/test.html】【可能还有参数】

这里有三个概念:

URI :Uniform Resource Identifier,统一资源标识符;

URL:Uniform Resource Locator,统一资源定位符;

URN:Uniform Resource Name,统一资源名称。是URL的一种更新形式,统一资源名称(URN,,Uniform Resource Name)不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假以时日,因为它需要更精密软件的支持。

其中,URL,URN是URI的子集。

URI编解码

uri中会遇到的两个问题:

在URI经常会出现一些明文内容,例如 https://baidu.com?query=破碎&t=知乎, 这样的uri的内容大家都是可见的,这就需要把一些特殊字符进行编码,

方法:encodeURI() ,把uri进行编码,但是并不会对uri中具有特殊含义的的字符进行编码,具体不会编码的部分包括括号中的字符【, / ? : @ & = + $ #】,

encodeURI('my test.asp?name=ståle&car=saab')

// my%20test.php?name=st%C3%A5le&car=saab

解码的话可以使用 decodeURI()

decodeURI('my%20test.php?name=st%C3%A5le&car=saab')

// my test.asp?name=ståle&car=saab

有的时候uri的某些组成部分自身含有一些特殊字符,这些特殊字符在uri自身在有着特殊意义,这样会导致错误的解析uri,例如:

test.asp?name=sta&le

//这里 query的name的值sta&le,包含了页数字符&,是的解析name的值为 sta 就停止了

这个时候也需要进行处理。同样也是对进行编码操作,

方法:encodeURIComponent(),这回对除了字母、数字、(、)、.、!、~、*、'、-和_之外的所有字符,而类似【 :;/?:@&=+$,#】 这些用于分隔 URI 组件的标点符号都会由一个或多个十六进制的转义序列替换的。

: [ ? ] [ # ]

//上面的描述是一个uri的完整组成,每个部分都可以认为是uri的组件,可以进行单独的编码

//用户输入的数据作为query参数,用户输入了'test&test=测试'这样的字符串时,只是一个查询参数

var uri = '//test.com';

var queryValue = 'test&test=测试'; //需要编码,不然会被当成两个键值对了

var uri += '?query=' + encodeURIComponent(queryValue);

//这样就是 query = 'test&test=测试';真正的结果,

//而不是 query = 'test'; test= '测试' 这样的两个键值对

解码方法:decodeURIComponent()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值