资讯专栏INFORMATION COLUMN

URI编解码详解encodeURIComponent、encodeURI

Youngdze / 2397人阅读

摘要:可选项目,一般使用隔开或隔开的键值对可选项目包,其它额外的标识信息和的不同这和长得也很相似,是的缩写,译为统一资源定位符。格式类似协议主机名具体地址可能还有参数这里有三个概念,统一资源标识符,统一资源定位符,统一资源名称。

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 这样的,

整体的书写方式如下:

 :  [ ?  ] [ #  ]

例如:

http://write.blog.csdn.NET/po...

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()

参考:http://blog.csdn.net/woyaowen...
https://baike.baidu.com/item/...
https://www.zhihu.com/questio...
http://blog.csdn.net/nicolas_...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84518.html

相关文章

  • 微信小程序开发中遇到的问题及解决办法(一)

    摘要:社区中的说法大概是这个是因为小程序架构的原因导致事件有一定的延迟,最终使的改变不够及时导致的。折中解决办法隐藏,使用结构,重新渲染分享图。 1、整个页面覆盖的自定义弹窗,滑动弹窗中的内容,页面内容也会滑动。如果快速滚动弹窗,页面内容和弹窗中的内容有时会错乱。这个问题大多出现在苹果手机上,类似事件事件穿透的效果。 自定义弹窗截图如下:showImg(https://segmentfaul...

    pakolagij 评论0 收藏0
  • 微信小程序开发中遇到的问题及解决办法(一)

    摘要:社区中的说法大概是这个是因为小程序架构的原因导致事件有一定的延迟,最终使的改变不够及时导致的。折中解决办法隐藏,使用结构,重新渲染分享图。 1、整个页面覆盖的自定义弹窗,滑动弹窗中的内容,页面内容也会滑动。如果快速滚动弹窗,页面内容和弹窗中的内容有时会错乱。这个问题大多出现在苹果手机上,类似事件事件穿透的效果。 自定义弹窗截图如下:showImg(https://segmentfaul...

    tinyq 评论0 收藏0
  • 微信小程序开发中遇到的问题及解决办法(一)

    摘要:社区中的说法大概是这个是因为小程序架构的原因导致事件有一定的延迟,最终使的改变不够及时导致的。折中解决办法隐藏,使用结构,重新渲染分享图。 1、整个页面覆盖的自定义弹窗,滑动弹窗中的内容,页面内容也会滑动。如果快速滚动弹窗,页面内容和弹窗中的内容有时会错乱。这个问题大多出现在苹果手机上,类似事件事件穿透的效果。 自定义弹窗截图如下:showImg(https://segmentfaul...

    lowett 评论0 收藏0
  • encodeURI、encodeURIComponent、decodeURI、decodeURICo

    摘要:组成形式一个是由组件分隔符分割的组件序列组成。其一般形式是其中斜体的名字代表组件,是当作分隔符的保留字符。以上说明摘自标准,为了容易读懂做了点编辑加工。 一、这四个方法的用处 1、用来编码和解码URI的 统一资源标识符,或叫做 URI,是用来标识互联网上的资源(例如,网页或文件)和怎样访问这些资源的传输协议(例如,HTTP 或 FTP)的字符串。除了encodeURI、encodeUR...

    stonezhu 评论0 收藏0

发表评论

0条评论

Youngdze

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<