深入分析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 相关文章推荐
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
Aug 11 Javascript
javascript页面动态显示时间变化示例代码
Dec 18 Javascript
一行命令搞定node.js 版本升级
Jul 20 Javascript
Javascript基础教程之break和continue语句
Jan 18 Javascript
浅谈Javascript事件对象
Feb 05 Javascript
原生js实现放大镜特效
Mar 08 Javascript
JS实现点击循环切换显示内容的方法
Oct 19 Javascript
jQuery实现的简单日历组件定义与用法示例
Dec 24 jQuery
从0到1搭建element后台框架优化篇(打包优化)
May 12 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
实现vuex原理的示例
Oct 21 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 和 MySQL 开发的 8 个技巧
2006/10/09 PHP
destoon实现调用热门关键字的方法
2014/07/15 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
javascript实现点击单选按钮链接转向对应网址的方法
2015/08/12 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
TensorFlow模型保存和提取的方法
2018/03/08 Python
python+opencv+caffe+摄像头做目标检测的实例代码
2018/08/03 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
What is the purpose of Void class? Void类的作用是什么?
2016/10/31 面试题
酒店保安领班职务说明书
2014/03/04 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
《法国号》教学反思
2016/02/22 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
Pytorch 如何实现常用正则化
2021/05/27 Python
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js