深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例


Posted in Javascript onAugust 04, 2014

JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape, decodeURI, decodeURIComponent 。

下面简单介绍一下它们的区别:

1 escape()函数

定义和用法

escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。

语法

escape(string)

参数  描述

string  必需。要被转义或编码的字符串。

返回值

已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。

说明

该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换。

2 encodeURI()函数

定义和用法

encodeURI() 函数可把字符串作为 URI 进行编码。

语法

encodeURI(URIstring)

参数  描述

URIstring  必需。一个字符串,含有 URI 或其他要编码的文本。

返回值

URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。

说明

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,#

3 encodeURIComponent() 函数

定义和用法

encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。

语法

encodeURIComponent(URIstring)

参数  描述

URIstring  必需。一个字符串,含有 URI 组件或其他要编码的文本。

返回值

URIstring 的副本,其中的某些字符将被十六进制的转义序列进行替换。

说明

该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。

提示和注释

提示:请注意 encodeURIComponent() 函数 与 encodeURI() 函数的区别之处,前者假定它的参数是 URI的一部分(比如协议、主机名、路径或查询字符串)。因此 encodeURIComponent() 函数将转义用于分隔 URI 各个部分的标点符号。

4 总结:

通过对三个函数的分析,我们可以知道:escape()除了 ASCII字母、数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法。而encodeURI()用于编码整个URI,因为URI中的合法字符都不会被编码转换。encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,它可以讲参数中的中文、特殊字符进行转义,而不会影响整个URL。

5 示例:

1 escape()

<script type="text/javascript">
document.write(escape("http://www.w3school.com.cn/") + "<br />")
document.write(escape("?!=()#%&"))
</script>

输出:

http%3A//www.w3school.com.cn

%3F%21%3D%28%29%23%25%26

2 encodeURI()

<script type="text/javascript">
document.write(encodeURI("http://www.w3school.com.cn/")+ "<br />")
document.write(encodeURI("http://www.w3school.com.cn/My first/"))
document.write(encodeURI(",/?:@&=+$#"))
</script>

输出:

http://www.w3school.com.cn/

http://www.w3school.com.cn/My%20first/

,/?:@&=+$#

对整个URL进行编码,而URL的特定标识符不会被转码。

3 encodeURIComponent()

例1:

<script type="text/javascript">
document.write(encodeURIComponent("http://www.w3school.com.cn/"))
document.write("<br />")
document.write(encodeURIComponent("http://www.w3school.com.cn/p 1/"))
document.write("<br />")
document.write(encodeURIComponent(",/?:@&=+$#"))
</script>

输出:

http%3A%2F%2Fwww.w3school.com.cn

http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F

%2C%2F%3F%3A%40%26%3D%2B%24%23

例2:

<script language="javascript">document.write('
<a href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent(" rel="external nofollow" http://cang.baidu.com/bruce42")+'">退出</a>');</script>

对URL中的参数进行编码,因为参数也是一个URL,如果不编码会影响整个URL的跳转。

Javascript 相关文章推荐
Javascript注入技巧
Jun 22 Javascript
jquery isType() 类型判断代码
Feb 14 Javascript
js加强的经典分页实例
Mar 15 Javascript
js 三级关联菜单效果实例
Aug 13 Javascript
JavaScript中的无阻塞加载性能优化方案
Oct 10 Javascript
javascript中定义类的方法汇总
Dec 28 Javascript
JavaScript定时器和优化的取消定时器方法
Jul 03 Javascript
jquery实现倒计时功能
Dec 28 Javascript
ReactNative实现Toast的示例
Dec 31 Javascript
基于JavaScript实现一个简单的Vue
Sep 26 Javascript
如何对react hooks进行单元测试的方法
Aug 14 Javascript
微信小程序实现通讯录列表展开收起
Nov 18 Javascript
checkbox选中与未选中判断示例
Aug 04 #Javascript
Node.js插件的正确编写方式
Aug 03 #Javascript
基于jquery实现的可编辑下拉框实现代码
Aug 02 #Javascript
基于编写jQuery的无缝滚动插件
Aug 02 #Javascript
js使用removeChild方法动态删除div元素
Aug 01 #Javascript
js使用html()或text()方法获取设置p标签的显示的值
Aug 01 #Javascript
js中的getAttribute方法使用示例
Aug 01 #Javascript
You might like
PHP面向对象分析设计的经验原则
2008/09/20 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
2016/01/13 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
python实现ip查询示例
2014/03/26 Python
python变量不能以数字打头详解
2016/07/06 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
Pandas中resample方法详解
2019/07/02 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
自我鉴定书范文
2013/10/02 职场文书
电话客服专员岗位职责
2014/06/28 职场文书
房屋认购协议书
2015/01/29 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
餐馆开业致辞
2015/08/01 职场文书
2016春节放假通知范文
2015/08/18 职场文书