深入分析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 相关文章推荐
JQuery设置时间段下拉选择实例
Dec 30 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
May 11 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
Mar 06 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 Javascript
JS检测数组类型的方法小结
Mar 14 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
Sep 16 Javascript
Node.js实现发送邮件功能
Nov 06 Javascript
AngularJS ui-router刷新子页面路由的方法
Jul 23 Javascript
利用Vue构造器创建Form组件的通用解决方法
Dec 03 Javascript
JS使用数组实现的队列功能示例
Mar 04 Javascript
微信jssdk踩坑之签名错误invalid signature
May 19 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
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
深入理解es6块级作用域的使用
2019/03/28 Javascript
VUE脚手架的下载和配置步骤详解
2019/04/01 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
2019/05/02 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
Python使用Scrapy爬取妹子图
2015/05/28 Python
python利用datetime模块计算时间差
2015/08/04 Python
Python重新加载模块的实现方法
2018/10/16 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
详解Python中的文件操作
2021/01/14 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
给民警的表扬信
2014/01/08 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
2014年维修工作总结
2014/11/22 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
党支部评议意见
2015/06/02 职场文书
学校运动会加油词
2015/07/18 职场文书
高三物理教学反思
2016/02/20 职场文书
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL