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

    参考的优秀文章

  • 相关阅读:
    Py 获取 Flash Player amf 数据
    字符串出现表情符解决方案(超超超超超级猛)
    常用 JS HOOK 代码段
    atob方法替换方案
    conda httperror解决办法
    requests content-length进行校验了怎么办!
    tensoreflow安装教程(亲测可用)
    Python 程序运行时CPU和内存高解决思路
    Python免安装保姆级教程
    Xpath剔除不需要的标签节点
  • 原文地址:https://www.cnblogs.com/nick-huang/p/5998212.html
Copyright © 2011-2022 走看看