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

参考的优秀文章

【Web】URI和URL,及URL的编码的更多相关文章

  1. Web开发者应知的URL编码知识

    原文出处:http://blog.jobbole.com/42246/ 本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding 来引出我们 ...

  2. Web开发者应知的URL编码知识(转)

    原文出处: lunatech   译文出处:oschina - 桔子, lwei, 史涛, Khiyuan, super0555, LinuxQueen, 抛出异常的爱 本文首先阐述了人们关于统一资源 ...

  3. C# System.Uri类_获取Url的各种属性_文件名_参数_域名_端口等等

    System.Uri类用于处理Uri地址信息,常用到它的地方有,相对Uri地址转绝对Uri地址,获取Uri的某部分信息等等,可以说是一个非常有用的类. 一.属性 AbsolutePath 获取 URI ...

  4. 网址URL中特殊字符转义编码

    网址URL中特殊字符转义编码字符 - URL编码值空格 - %20" - %22# - %23% - %25& - %26( - %28) - %29+ - %2B, - %2C/ ...

  5. URI与URN与URL详解

    当没有URI时 什么是URI和URN和URL URI详解 Uniform Resource Identifier 统一资源标识符 URI的组成 案例: https://tools.ietf.org/h ...

  6. URL encoding(URL编码)

    URL encoding(URL编码),也称作百分号编码(Percent-encoding),是指特定上下文的统一资源定位符(URL)编码机制UrlEncode:将字符串以URL编码返回值:字符串函数 ...

  7. URL安全的Base64编码

    Base64编码可用于在HTTP环境下传递较长的标识信息.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码不仅比较简短,同时也具有不可 ...

  8. 用urlencode(String str)对URL传递参数进行编码,提高安全

    在PHP 提交地址后面带有参数的时候,参数会在浏览器的地址栏暴露无疑,这样是不安全的,这个时候就必须用些方法对这些参数进行安全处理 这里可以用 urlencode(String URL);//对URL ...

  9. iOS - 网址、链接、网页地址、下载链接等正则表达式匹配(解决url包含中文不能编码的问题)

    DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母.标号中除连字符(-)外不能使用其他的标点符号.级别最低的域名写在最左边,而级别最高的域名写在最右边.由多 ...

  10. 在一个web 应用中,改变url无非是2种方式,一种是利用超链接进行跳转,另一种是使用浏览器的前进和回退功能

    在一个web 应用中,改变url无非是2种方式,一种是利用超链接进行跳转,另一种是使用浏览器的前进和回退功能 https://www.jianshu.com/p/27ee7df4ccc1

随机推荐

  1. 怎么搭建DC+SCCM 域环境(一)

    需要的软件: 1. SCCM 2012 SP1 2. SQL Server 2012 3. System ISO 4. ADK 环境搭建顺序: 1. 安装DC和SCCM 机器,并配置需要的IP.DNS ...

  2. C语言 ---- 指针 iOS学习-----细碎知识点总结

    内存的访问形式:1.直接访问:通过变量名进行访问.2.间接访问:先找到变量存放的地址,然后根据地址去访问对应的内存空间. 指针--- // 定义一个整形指针变量,用来存储num1在内存中的地址    ...

  3. u-boot FIT image介绍_转自“蜗窝科技”

    转自:http://www.wowotech.net/u-boot/fit_image_overview.html 1. 前言 Linux kernel在ARM架构中引入设备树device tree( ...

  4. 使用HTTPS网站搭建iOS应用内测网站(OTA分发iOS应用)

    为什么要搭建应用内测网站呢? 1.AppStore的审核速度比较慢,万一被拒,还得等,而且一旦发布,任何人都可以下载,而有些时候只有老板想知道最新的修改是否符合要求,万一不符合要求呢?又要修改了. 2 ...

  5. Android出现java.net.SocketException: Permission denied报错

    是由于权限问题导致的,在manifests中找到AndroidManifest.xml 在manifest节点下新增 <uses-permission android:name="an ...

  6. python脚本生成exe可执行文件

    1.先安装第三方插件: py2exe. Get py2exe from http://www.py2exe.org/ 在download里下载与自己python对应的版本 2.写一个测试python文 ...

  7. rosetta2014/2015安装时出现INCLUDE(keyerror)错误,解决。

    错误: KeyError: 'INCLUDE' 使编译出错 解决方法: [usrname@host source]$ vim tools/build/site.settings 注释# "i ...

  8. ZOJ 2412 Farm Irrigation

    Farm Irrigation Time Limit: 2 Seconds      Memory Limit: 65536 KB Benny has a spacious farm land to ...

  9. 多线程java的concurrent用法详解(转载)

    我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...

  10. UVALive 7141 BombX(离散化+线段树)(2014 Asia Shanghai Regional Contest)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...