zoukankan      html  css  js  c++  java
  • 【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的某些组成部分编码,所以都会编码。

    参考的优秀文章

  • 相关阅读:
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    449. Serialize and Deserialize BST
    114. Flatten Binary Tree to Linked List
    199. Binary Tree Right Side View
    173. Binary Search Tree Iterator
    98. Validate Binary Search Tree
    965. Univalued Binary Tree
    589. N-ary Tree Preorder Traversal
    eclipse设置总结
  • 原文地址:https://www.cnblogs.com/nick-huang/p/5998212.html
Copyright © 2011-2022 走看看