【Web】URI和URL,及URL的编码

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的某些组成部分编码,所以都会编码。

参考的优秀文章

posted @ 2016-10-25 20:58  nick_huang  阅读(2464)  评论(1编辑  收藏  举报