URI编解码详解encodeURIComponent、encodeURI

URI

URI是Universal Resource Identifier通用资本标志符,是一个用于标识某一互联网资本称号的字符串。 该种标识许可用户对任何(包括当地和互联网)的资本经由过程特定的协定举行交互操纵。URI由包括肯定语法和相干协定的计划所定义。

URI的初识

多少部份

  1. 协定/scheme name
    类似 https、http、file、ed2k

  2. 主机名
    这部份比较熟习的是 //baidu.com 收集主机,也多是其他的情势的资本:mailto:称号@域名 用户邮箱,

  3. query/参数
    类似a=1&b=2

  4. 标识符/锚点
    有的URI指向的不是全部资本,而是某个资本的内部某个模块,这也是我们熟习的锚点:https://baidu.com#test,这是指向资本内部的某一部份。

  5. 相对URI
    有的时刻要求的资本多是相对当前资本的途径来完成的,<img src=”../icons/logo.gif” alt=”logo”> 如许的,

团体的誊写体式格局以下:

<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]

比方:

  • 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 name>:很明显,这是scheme的称号,关于上面五个scheme,它们scheme名分别是http,file, git, ftp, ed2k(电驴协定),实际上,它们也代表着协定称号。
<hierarchical part>:实际上,平常状况,它包括 authority 和 path【//baidu.com、///c:/WINDOWS/clock.avi】。
<query>:可选项目,平常运用;离隔或&离隔的键值对<key>=<value>【a=1&b=2】
<fragmentg> :可选项目包,别的分外的标识信息[#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中会碰到的两个题目:

  1. 在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

  2. 有的时刻uri的某些构成部份本身含有一些特别字符,这些特别字符在uri本身在有着特别意义,如许会致使毛病的剖析uri,比方:

    test.asp?name=sta&le 
    //这里 query的name的值sta&le,包括了页数字符&,是的剖析name的值为 sta 就住手了

    这个时刻也须要举行处置惩罚。一样也是对举行编码操纵,
    要领:encodeURIComponent(),这回对除了字母、数字、(、)、.、!、~、*、’、-和_以外的一切字符,而类似【 :;/?:@&=+$,#】 这些用于分开 URI 组件的标点符号都会由一个或多个十六进制的转义序列替代的。

    <scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]
    //上面的形貌是一个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_…

    原文作者:caoweiju
    原文地址: https://segmentfault.com/a/1190000010433195
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞