当前位置:云好站网站目录 » 文章资讯 » 网站运营 » 文章详细

全面深度解析URL编码和URL解码方法过程

网站运营 108

一、URL含义1、URL定义

URL 是Uniform Resource Locator 的缩写,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名、参数,如“协议://授权/路径查询?参数”。

**URL 与 URI **

很多人会混淆这两个名词。

• URL:(Uniform/Universal Resource Locator 的缩写,统一资源定位符)。

• URI:(Uniform Resource Identifier 的缩写,统一资源标识符)。

对于URI, 具体的结构如下:

URI 属于 URL 更低层次的抽象,一种字符串文本标准。URL 是 URI 的一个子集。URI 表示请求服务器的路径,定义这么一个资源。而 URL 同时说明要如何访问这个资源(http://)。

URL 百度百科[1]

2、URL字符编码表

1、URL 编码 - 从 到 %ff[2]

2、HTML特殊字符编码对照表[3]

二、URL 编码

1、为什么要编码转义

推荐阅读:字符编码:ASCII、Unicode 和 UTF-8 的区别[4]

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号,不同的编码方式,解码出来就是乱码,造成数据传输和阅读的极大障碍。互联网的来临,必须要统一字符编码,Unicode(统一码、万国码、单一码)作为计算机科学领域里的一项业界标准应运而生。Unicode 是互联网统一的符号集,只规定了符号唯一的二进制代码值,却没有规定这个二进制代码应该如何存储。UTF-8是一种针对Unicode的可变长度字符编码,UTF-8用1到4个字节编码Unicode字符,在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。

注意:UTF-8 是 Unicode 的实现方式之一。

如中字:

• Unicode码值:\u4e2d

• URL编码(UTF-8):%e4%b8%ad

2、URL编码规则

Url编码通常也被称为百分号编码,编码方式非常简单,使用%百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。Url编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61,我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。又如@符号在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。

对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87"。

3、URL不需要编码的字符

HTTP URL 使用的RFC3986编码规范,RFC3986文档规定,URL中只允许包含以下四种:

1、英文字母(a-z A-Z)

2、数字(0-9)

3、-_.~ 4个特殊字符

4、所有保留字符,RFC3986中指定了以下字符为保留字符(英文字符):! * ' ( ) ; : @ & = + $ , / ? # [ ]

5、编码标记符号 %

URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 的字符,中文是三个编码组合。十六进制格式用于在浏览器和插件中显示非标准的字母和字符。

4、URL需要编码的字符

Url编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。

4.1、非URL定义的字符

不能在 URL 中包含任何非 ASCII 字符,如中文字符、希腊文字符,拉丁文字符等。如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成乱码问题。

4.2、会引起歧义的保留字符

URL 拼接参数或路径设置时,拼接的普通字符串中含有保留字符,会引起歧义的情况。URL 参数字符串中使用 key=value 这样的键值对形式来传参,键值对之间以 & 符号分隔,如宝洁公司的简称为P&G,假设需要当做参数去传递,name=P&G&t=1450591802326,因为参数中多了一个&势必会造成接收 URL 的服务器解析错误,因此必须将引起歧义的 & 符号进行转义编码。

部分保留字符及其URL编码

如果需要在URL中用到特殊字符或中文字符,需要将这些特殊字符换成相应的十六进制的值。

三、iOS端URL具体编码处理1、URL编码和解码是成对

URL编码和解码是一个可逆的过程,编码和解码的逻辑是翻转对应的。成对有两层含义:

• 1、两个方法的逻辑对应。一个固定的编码方式,也对一个固定的逆向解码方式,反之亦然。

• 2、编码和解码的次数也要一一对应。

这四种种字符后,URL编码后的值还是它本身:

1、英文字母(a-z A-Z)

2、数字(0-9)

3、特殊字符( -_.)

4、部分保留字符(英文字符):! * ' ( ) ; : @ & = + $ , / ?

说明:~ # []这四个字符是否被转码成百分号编码,因系统不同会有不同。URL字符编码使用%百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。因编码后的值含有%保留字符。再次编译%会编译成%25。

例如:&

第一次URL编码后:%26

第二次URL编码后:%2526

第三次URL编码后:%252526

正常解码逻辑:

第一次URL解码后:%2526

第二次URL解码后:%26

第三次URL解码后:&因此,URL编码和解码必须是成对出现的。初始字符为 & 连续编码三次,连续解码两次,则得到 %26 。初始字符为 &%26 编码一次:%26%2526 连续解码两次则得到 && 。

2、URL是怎么解码的

我们看一个常见的接口请求示例:

一般会根据://、:、/、?、&、=等拆分出请求的协议、服务器名称(或IP地址)、端口号、路径和文件名、参数名、参数值等。

3、在组装URL的什么阶段进行URL编码

我们看一个常见的接口请求示例:

绿色字体是保留字符,都有特殊的含义,是不应该是被编码的。红色字体必须要要编译的部分。黄色背景的字符串,不应该被编译。若以上操作不正确,会影响整个URL的解析。