URI和URL是什么,以及他们的区别
- URL,
Uniform Resource Locator
,统一资源定位符。用于表示网络上服务器的资源所在位置,比如我们输入浏览器的地址。 - URI,
Uniform Resource Identifier
,统一资源标识符。它唯一标识了资源。资源的位置能从地址上标识一个资源,所以,URI一种表现形式是URL,URI还有其他表现形式,但这里不介绍。
URL的组成
URL。
一个URL的样例:http://www.xxxxxx.com/helloween.jpg
,一个URL可以分为3部分: - 第一部分:
http
访问资源所使用的协议类型,常见的是HTTP、HTTPS、FTP等。 - 第二部分:资源所在的服务器地址,上述
www.xxxxxx.com
是一个域名,客户端会通过DNS(Domain Name Server,域名服务器)得到相应的IP地址。 - 第三部分:
/helloween.jpg
是指资源在服务器的位置。
例子:
http://www.xxxxxx.com/helloween.jpg
https://www.xxxxxx.com/helloween.action?userId=123456
jdbc:mysql://localhost:3306/demo?user=root&password=123456&useUnicode=true&characterEncoding=UTF8
ftp://guest:123456@127.0.0.1
URL的编码
为什么URL要编码?
答:URL是表示网络上各种资源的地址,表示网络上各资源的地址可能是由各种各样的字符组成,可能包含许多特殊字符,甚至一些不可打印的字符。而用URL表示这些地址,基于要适应各种协议、应用程序的要求,URL必须是通用性强,而已还必须对人们是可读的。所以,就有了将URL编码的方法,用一些安全的字符集合编码表示URL,简单来说,就是用一串安全的字符表示原先的可能包含特殊字符、不可打印字符的地址。URL的编码方式是怎么样的?
答:用安全的字符表示不安全的字符。转义后的安全字符字符为16进制数,每两位前面加%,见以下示例:比如&,它在ASCII表用10进制38表示,16进制26表示,所以,URL编码后为%26。
比如“你好”,它的UTF-8编码用16进制表示是e4bda0e5a5bd,所以,URL编码后为%e4%bd%a0%e5%a5%bd。 比如“你好”,它的GB2312编码用16进制表示是c4e3bac3,所以,URL编码后为%c4%e3%ba%c3。不知道某字符的UTF-8或GBK编码的16进制是多少?以下的Java小程序可参考:
public class UTF8Utils { public static void main(String[] args) throws Exception { String s = "你好"; System.out.println(s); System.out.println(UTF8Utils.bytesToHex(s.getBytes("UTF-8"))); // e4bda0e5a5bd System.out.println(UTF8Utils.bytesToHex(s.getBytes("GB2312"))); // c4e3bac3 } /** * 字节数组转十六进制 * @param bytes 字节数组 * @return 十六进制 */ public static String bytesToHex(byte[] bytes) { if (bytes == null || bytes.length == 0) { return null; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { int r = bytes[i] & 0xFF; String hexResult = Integer.toHexString(r); if (hexResult.length() < 2) { sb.append(0); // 前补0 } sb.append(hexResult); } return sb.toString(); } }
浏览器URL编码所用的字符集不同的问题,及如何统一处理
我们使用常用的浏览器IE、Chrome、Firefox访问URL时,不免使用到一些不安全字符,这是浏览器会如何处理呢?
- 有些会自动将不安全的字符编码,有些不会。这取决于浏览器的机制以及你的设置。
- 有些会自动将不安全的字符通过UTF-8编码,有些会通过GB2312编码,甚至是其他编码。这取决于多方面原因,如浏览器的机制、浏览器的设置、操作系统的默认编码。
那么多方面的原因导致URL编码结果不确定性,对我们的开发工作带来诸多不便,比如,我们在后面设置用UTF-8解码,有没有办法要求客户端用UTF-8编码URL呢?
答:用Javascript的encodeURL()或encodeURLComponent()吧,它们会将URL用UTF-8方法编码。它们两者的区别在于:- encodeURL()一般用于整体URL的编码的,所以URL一些保留符号(如?、&等)不被编码。
- encodeURLComponent()一般对URL的某些组成部分编码,所以都会编码。
参考的优秀文章
- 《HTTP权威指南》人民邮电出版社