深入分析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 相关文章推荐
一段实时更新的时间代码
Jul 07 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
Jan 07 Javascript
JS小游戏之极速快跑源码详解
Sep 25 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
Apr 17 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
May 20 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
canvas实现探照灯效果
Feb 07 Javascript
JS身份证信息验证正则表达式
Jun 12 Javascript
jQuery实现QQ空间汉字转拼音功能示例
Jul 10 jQuery
微信小程序tabbar底部导航
Nov 05 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 03 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中对数据库操作的封装
2006/10/09 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
ThinkPHP实现生成和校验验证码功能
2017/04/28 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
基于jQuery实现的当离开页面时出现提示的实现代码
2011/06/27 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
2016/08/17 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python 读取二进制 显示图片案例
2020/04/24 Python
用python写爬虫简单吗
2020/07/28 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
介绍一下Python中webbrowser的用法
2013/05/07 面试题
临床医学专业毕业生的自我评价
2013/10/17 职场文书
学生就业推荐信
2013/11/13 职场文书
《白鹅》教学反思
2014/04/13 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
浅谈MySQL中的六种日志
2022/03/23 MySQL
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL