博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Web】URI和URL,及URL的编码
阅读量:5775 次
发布时间:2019-06-18

本文共 2525 字,大约阅读时间需要 8 分钟。

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权威指南》人民邮电出版社

转载地址:http://trhux.baihongyu.com/

你可能感兴趣的文章
springmvc+swagger2
查看>>
软件评测-信息安全-应用安全-资源控制-用户登录限制(上)
查看>>
我的友情链接
查看>>
Java Web Application 自架构 一 注解化配置
查看>>
如何 debug Proxy.pac文件
查看>>
Python 学习笔记 - 面向对象(特殊成员)
查看>>
Kubernetes 1.11 手动安装并启用ipvs
查看>>
Puppet 配置管理工具安装
查看>>
Bug多,也别乱来,别被Bug主导了开发
查看>>
sed 替换基础使用
查看>>
高性能的MySQL(5)创建高性能的索引一B-Tree索引
查看>>
附件3:eclipse memory analyze使用教程
查看>>
oracle备份与恢复--rman
查看>>
图片变形的抗锯齿处理方法
查看>>
Effective C++ Item 32 确保你的 public 继承模子里出来 is-a 关联
查看>>
phpstorm安装laravel-ide-helper实现自动完成、代码提示和跟踪
查看>>
python udp编程实例
查看>>
TortoiseSVN中图标的含义
查看>>
js原生继承之——构造函数式继承实例
查看>>
linux定时任务的设置
查看>>