深入分析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基础第一章 JavaScript与用户端
Jul 22 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
Aug 27 Javascript
再次分享18个非常棒的jQuery表格插件
Apr 10 Javascript
jQuery实现长文字部分显示代码
May 13 Javascript
js操作table示例(个人心得)
Nov 29 Javascript
javascript常用方法总结
May 14 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
Jan 12 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
May 26 Javascript
js笔试题-接收get请求参数
Jun 15 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
Vue中jsx不完全应用指南小结
Nov 01 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
Aug 13 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
示例详解Laravel的注册重构
2016/08/14 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
原生javascript和jquery判断浏览器版本等信息
2013/07/04 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
javascript设计模式之Adapter模式【适配器模式】实现方法示例
2017/01/13 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
python ddt实现数据驱动
2018/03/14 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python @property使用方法解析
2019/09/17 Python
Python单元测试与测试用例简析
2019/11/09 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
Python实现一个论文下载器的过程
2021/01/18 Python
Python扫描端口的实现
2021/01/25 Python
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
单位成立周年感言
2014/01/26 职场文书
招标承诺书
2014/08/30 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
党员个人查摆剖析材料
2014/10/16 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers