百分号编码(URL编码)
百分号编码又叫做URL编码,是一种编码机制,只要用于URI(包含URL和URN)编码中。
URL中那些字符需要编码,又为什么进行编码
一、URL是什么?
URL(Uniform Resource Locator),统一资源定位符,是地址的别名。包含了关于文件储存位置和浏览器应该如何处理他的信息。互联网上的每一个文件都有唯一的URL。
URL分为三个部分:
第一部分模式;
第二部分文件所在的主机名称
第三部分路径(目录+文件名)
一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他的文字和符号
URL只能使用 ASCII 字符集来通过网络进行发送。由于URL经常包含ASCII 码之外的字符,所以必须将 URL 转换为有效的ASCII 码的格式。
URL编码通常会使用 % 后面跟随两个十六进制数字来替换 非ASCII 字符;
URL不能包含空格。所以进行编码时经常使用 + 来替换空格;
二、为什么使用百分号编码(URL编码)
为什么会需要编码?
那是因为这样东西不适合传输。原因可能有很多种:大小过大,包含隐私数据。对于URL而言,之所以进行编码是因为URL中有一些字符会引起歧义。
例如:URL参数字符串中使用键值对这样的形式来传参,键值对之间使用了 & 符号分隔。
如果value字符串中包含了 @ 或 & 等字符,那么一定会造成接收URL的服务器解析错误,因此就需要对造成歧义的 @ 和 & 进行转义,对其进行编码。
还有,如果URL的字符集使用的ASCII 码,不是 Unicode,这就意味着不可以在 URL 中包含任何的非 ASCII 码,例如:中文,否则客户端浏览器和服务器设定的字符集不同的情况下,输入的中文就会出现乱码。
百分号编码(URL编码)会对URL不允许出现的字符或者其他特殊情况的允许的字符进行编码,对于被编码的字符,最终会转为百分号 % 开头,后面跟这昂个十六进制数字的形式。例如:空格(SP)是不允许的字符,在ACSII码中对应的的二进制值是 00100000 ,最终转换为 %20。
URL编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去掉那些不安全的字符,以保证内容的正常显示。
三、需要编码的字符
RFC3986文档中规定,URL中只需要包含英文字母(a~zA~Z)、数字(0~9)、(- _ . ~)四个特殊字符以及所有保留字符。
URL经常包含ASCII 码之外的字符,所以必须将 URL 转换为有效的ASCII 码的格式。
有一些字符需要经过编码才不会引起URL语义的转变
US-ASCII字符集中没有对应的可打印字符
Url中只允许使用可打印字符。US-ASCII码中的10-7F字节全都表示控制字符,这些字符都不能直接出现在Url中。同时,对于80-FF字节(ISO-8859-1),由于已经超出了US-ACII定义的字节范围,因此也不可以放在Url中。
保留字符
只有字母和数字[0-9 a-z A-Z]、一些特殊符号"$ - _ . + ! * '(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。
URL 可以划分为若干个 组件、协议、主机、路径等。有一些字符(: / ? # [ ] @)用以分隔不同的组件。
例如:冒号(:)用于分隔协议和主机;
斜线(/)用于分隔主机和路径;
问号(?)同于分隔路径和查询参数;
还有一些字符(! $ & ' () * + , ; =)用于在每个组件中起到分隔作用的。
例如:等号(=)用于表示查询参数中的键值对;
and符(&)用于分隔查询多个键值对;
当组件中的普通数据包含这些特殊字符的时候,就需要对其进行编码。
(一)保留字符
Url可以划分成若干个组件,协议、主机、路径等。有一些字符(:/?#[]@)是用作分隔不同组件的。例如:冒号用于分隔协议和主机,/用于分隔主机和路径,?用于分隔路径和查询参数,等等。还有一些字符(!$&'()*+,;=)用于在每个组件中起到分隔作用的,如=用于表示查询参数中的键值对,&符号用于分隔查询多个键值对。当组件中的普通数据包含这些特殊字符时,需要对其进行编码。
RFC3986中指定了以下字符为保留字符:

(二)不安全字符
还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。
| 空格 | Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉 |
| 引号以及<> | 引号和尖括号通常用于在普通文本中起到分隔Url的作用 |
| # | 通常用于表示书签或者锚点 |
| % | 百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码 |
| {}|\^[]`~ | 某一些网关或者传输代理会篡改这些字符 |
对于Url中的合法字符,编码和不编码是等价的,但是对于上面提到的字符,如果不经过编码,很有可能会造成Url语义的不同。
因此对于Url而言,只有普通英文字符和数字,特殊结构字符 $-_.+!*'()还有保留字符,才能出现在未经过编码的Url中。
其他字符均需要经过编码之后才能出现在Url中。
但是由于历史原因,目前尚存在一些不标准的编码实现。例如对于~符号,虽然RFC3986文档规定,对于波浪符号~,不需要进行Url编码,但是还是有很多老的
关或者传输代理会
四、如何对Url中的非法字符进行编码
Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。Url编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61,我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。又如@符号在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。
常见字符的Url编码列表:
| ! | * | " | ' | ( | ) | ; | : | @ | & |
%21 |
%2A |
%22 |
%27 |
%28 |
%29 |
%3B |
%3A |
%40 |
%26 |
| = | + | $ | , | / | ? | % | # | [ | ] |
%3D |
%2B |
%24 |
%2C |
%2F |
%3F |
%25 |
%23 |
%5B |
%5D |
对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。
对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如“中文”使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到“%E4%B8%AD%E6%96%87”。
如果某个字节对应着ASCII字符集中的某个非保留字符,则此字节无需使用百分号表示。
例如“Url编码”,使用UTF-8编码得到的字节是0x55 0x72 0x6C 0xE7 0xBC 0x96 0xE7 0xA0 0x81,由于前三个字节对应着ASCII中的非保留字符“Url”,因此这三个字节可以用非保留字符“Url”表示。最终的Url编码可以简化成“Url%E7%BC%96%E7%A0%81” ,当然,如果你用"%55%72%6C%E7%BC%96%E7%A0%81”也是可以的。
由于历史的原因,有一些Url编码实现并不完全遵循这样的原则
参考博客:http://www.cnblogs.com/ECJTUACM-873284962/
百分号编码(URL编码)的更多相关文章
- 混乱的url编码||URL编码解码问题
转载自:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 一.问题的由来. url就是网址,只要上网就一定会用到. 一般来说,URL只能 ...
- javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码
乱码是一个经常出现的问题 请求中,参数传递的过程中也是经常出现乱码的问题 本文主要整理了请求乱码中的问题以及解决思路 先要理解一个概念前提: 编码就是把图形变成数值码所以说: 图形的字符 -- ...
- url 编码(percentcode 百分号编码)(转载)
原文地址:http://www.cnblogs.com/leaven/archive/2012/07/12/2588746.html http://www.imkevinyang.com/2009 ...
- url 编码(percentcode 百分号编码)
http://www.imkevinyang.com/2009/08/%E8%AF%A6%E8%A7%A3javascript%E4%B8%AD%E7%9A%84url%E7%BC%96%E8%A7% ...
- 详解JavaScript中的Url编码/解码,表单提交中网址编码
本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和 编解码相关的几对函数escape / unescape ...
- url编码&&PHP大法
URL编码 Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符--012 ...
- 为什么要进行URL编码
我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割.如"?name1=value1&a ...
- Javascript中的url编码与解码(详解)
摘要 本文主要针对URI编解码的相关问题做了介绍,对url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript中和编解码相关的几对函数escape / unescap ...
- Web开发者应知的URL编码知识
原文出处:http://blog.jobbole.com/42246/ 本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding 来引出我们 ...
随机推荐
- 【HANA系列】SAP UI5上传图片 用XSJS存储在HANA中的方法
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP UI5上传图片 用XSJ ...
- tarjan缩点相关知识及代码
emmm原谅我确实是找不到不用缩点的tarjan题才会想到自学一下缩点这个东西的.. 题目没有,只能自己出数据并手动模拟... 首先看一张图(懒得画,还是看输入数据吧,劳烦自行画图..) 7 9(n个 ...
- ROS自动切换策略
自动切换策略,具体如下 监视地址:1.1.1.1 轮询时间:30s:超时时间:1000ms up /ip firewall nat set [/ip firewall nat find comment ...
- 【AI-人工智能-mmdetection】ModuleNotFoundError: No module named 'mmdet.version'
在集成 mmdetection 框架时遇到这样的问题. ModuleNotFoundError: No module named 'mmdet.version' mmdetection 框架搭建过程很 ...
- qt 两种按钮点击事件应用
1.传统connect 例如: connect(ui->findPushBtn,SIGNAL(clicked()),this,SLOT(find())); 参数1:事件UI 参数2:点击系统函数 ...
- Linux-usermod:增加已建立用户的用户组
usermod --help -g, --gid GROUP force use GROUP as new primary group -G, --groups GROUPS new list of ...
- Android快捷键大全
参考来源:https://mp.weixin.qq.com/s/T809p17Wt8XHkbLwcQf9ow 1,Ctrl + J 快捷代码列表 2,Ctrl+Alt+O 这个快捷键可以自动导包或删 ...
- python正则表达式re 中m.group和m.groups的解释
转载:http://www.cnblogs.com/kaituorensheng/archive/2012/08/20/2648209.html 先看代码instance: >>> ...
- mysql整理-常用sql语句
一.常用sql show variables like 'character_set_client';#查询字符集 show databases;#列出所有的服务器上的数据库alter create ...
- 【BZOJ-4289】Tax 最短路 + 技巧建图(化边为点)
题意 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权N<=10 ...