URI 和 URL的一些研究笔记
1. 关键字回顾:
RFC(Request For Comments) ,RFC文档是一系列关于Internet(早期为ARPANET)的技术资料汇总,于1969年开始发布。它制定了我们很多常见和不常见的Internet的各种文字资料和规范。
URI(Universal Resource Identifiers) 统一资源标识符, RFC 文献1630中定义了它详细的规范(1994年6月)
|- URL(Uniform Resource Locators) 统一资源定位符,RFC文献1738中定义了它详细的规范(1994年12月)
在URI的规范中,资源描述文字,只允许使用字母,数字,安全字符,特殊字符,和转义字符
转义字符在URL中规定是使用%和两个hex进行表示,所以也就是为什么浏览器的form post会自动进行转义成%xx的关系而不使用unicode的关系。
但是值得注意的是在URI中,空格是作为保留字的,所以URI规范中空格被辅以一个快速标记符号(short hand notation)来进行标识,就是我们看到的+号。所以在php中提供的urlencode方法是为了把字符串转换成URI规范用的, 保留空格转换成+号,可以模拟出浏览器form post的结果。
2. 说说 URL
URL 其实是 URI 中的一个子集,URI是一个很宽泛的定义,而且也在URI的基础上做了自己的特殊规范,例如
另外 URL 中把 # 规定成锚点是用来定位使用,使用了URI规定的保留字中的一个字符。
当然URL的escape也遵循了URI的规范使用 %和两个hex的格式。
值得注意的是URL的保留字和URI是不一样的,这些字符都是有特殊意义的
有没有注意到空格在里面?在URL规范中,空格只是认为不安全(unsafe)的存在,因为可能会因为排版和打印关系,可能会被忽略,所以URL中是需要把空格转换成%20的。对应的php提供的rawurlencode 方法是用来把字符串转换成URL的标准。
JS中的 encodeURI和encodeURIComponent 对字符的转义,虽然也是按照URI规范转义,但是它并没还有转换空格成+号,而是%20,后者会把URI的保留字; : / ?也进行转义。为什么浏览器和流行的server遇到 “ “,%20,+ 都会转换成空格?其实是为了更好兼容URI标准。
其实很多流行的http server都已经根据标准自动把url进行decode后给到后面的CGI进行处理,而我们自己的server很多时候需要开发来对这些进行decode。如果对这些标准不了解就很容易在decode的时候使用错误的decode手段。
而unicode目前使用场景最多的是在我们的脚本语言和页面展示中,为了支持更宽的字符集,用一种统一的编码来规范处理文字而使用,浏览器会根据资源的定义(charset) 对目标的文字先进行unicode转义后再进行统一的处理,这样就可以保证一个utf-8 的页面也可以同时支持请求GB2312的资源,而不会因此显示出错。
3. 附件:
除了URI和URL以外,还有一个不太流行的URN(Uniform Resource Name), 有兴趣的同学可以自己研究:P,它同样也是属于URI的子集。