encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent() URL编码

Global对象的encodeURI()和encodeURIComponent()方法对URI进行编码,以便发送给浏览器。有效的URI中不能包含某些字符,例如空
格。而这两个URI编码方法就可以对URI进行编码,它们用特殊的UTF-8编码替换所有无效的字符,从而让浏览器接受和理解。

其中,encodeURI()主要用于整个URI(例如,http://www.w3cmm.com/illegal value.htm),而encodeURIComponent()主要用于对URI中的某一段(例如前面URI中的illegal value.htm)进行编码。它们的主要区别在于,encodeURI()不会对本身术语URI的特殊字符进行编码,例如冒号、正斜杠、问号和井字号;而encodeURIComponent()则会对它发现的任何 非标准字符进行编码。来看下面的例子:

var uri = "http://www.w3cmm.com/illegal value.htm#start";
//"http://www.w3cmm.com/illegal%20value.htm#start"
alert(encodeURI(uri));

//"http%3A%2F%2Fwww.w3cmm.com%2Fillegal%20value.htm%23start"
alert(encodeURIComponent(uri));

使用encodeURI()编码后的结果是除了空格之外的其它字符都原封不动,只有空格被替换成了%20。而在encodeURIComponent()方法则会使用对应的编码替换所有非字母数字字符。这也正是可以对整个URI使用encodeURI(),而只能对附加在现有URI后面的字符串使用encodeURIComponent()的原因所在。

一般来说,我们使用encodeURIComponent()方法的时候要比使用encodeURI()更多,因为在实践中更常见的是对查询字符串参数而不是对基础URI进行编码。

与encodeURI()和encodeURIComponent()方法对应的两个方法分别是decodeURI()和decodeURIComponent()。其中,decodeURI()只能对使用encodeURI()替换的字符进行解码。例如,它可将%20替换成一个空格,但不会对%23作任何处理,因为%23表示井字号(#),而井字号不是使用encodeURI替换的。同样地,decodeURIComponent()能够解码使用encodeURIComponent()编码的所有字符,即它可以解码任何特殊字符的编码。来看下面的例子:

var uri = "http%3A%2F%2Fwww.w3cmm.com%2Fillegal%20value.htm%23start"
//"http%3A%2F%2Fwww.w3cmm.com%2Fillegal value.htm%23start"
alert(decodeURI(uri));

//"http://www.w3cmm.com/illegal value.htm#start"
alert(decodeURIComponent(uri));

这里,变量uri包含着一个由encodeURIComponent()编码的字符串。在第一次调用decodeURI()输出的结果中,只有%20被替换成了空格。而在第二次调用decodeURIComponent()输出的结果中,所有特殊字符的编码都被替换成了原来的字符,得到了一个未经转义的字符串。

URI方法encodeURI()、encodeURIComponent()、decodeURI()和decodeURIComponent()用于替代已经被ECMA-262第三版废弃的escape()和unescape()方法。URI方法能够编码所有Unicode字符,而原来的方法只能正确地编码ASCII字符。因此在开发实践中,特别是在产品级的代码中,一定要使用URI方法,不要使用escape()和unescape()方法。

最新文章

  1. C#如何分割多个空格分隔的字符串?
  2. tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片
  3. IOS第15天(2,事件处理,侧滑菜单,抽屉效果)
  4. C# 开发者代码审查清单【转】
  5. 蓝凌表单的表体调用Javascript
  6. 多线程相关Interlocked.Increment问题
  7. hdu3037 Lucas定理
  8. UVaLive 7363 A Rational Sequence (二叉树)
  9. windows理论基础(一)
  10. [google面试CTCI]1-3.字符串去重
  11. php中(包括织梦cms)set_time_limit(0)不起作用的解决方法
  12. 学习笔记-JS公开课三
  13. Tomcat设置HTTPS访问
  14. spring Cache注解详解
  15. HTML5本地存储之本地数据库篇
  16. MySQL数据库导入错误:ERROR 1064 (42000) 和 ERROR at line xx:
  17. Spring(四)使用注解注入Bean
  18. vs2013 error LNK2005 已经在***.obj中定义
  19. 【Ray Tracing in One Weekend 超详解】 光线追踪1-7 Dielectric 半径为负,实心球体镂空技巧
  20. Docker 技巧:删除 Docker 所有镜像

热门文章

  1. 软件测试人员需要精通的开发语言(3)--- Linux
  2. 【BZOJ4537】[Hnoi2016]最小公倍数 分块
  3. 【BZOJ3689】异或之 堆+可持久化Trie树
  4. [原创]css设置禁止中文换行
  5. sgu Theodore Roosevelt【判断点是否在凸多边形内模板】
  6. POJ 286 Y2K Accounting Bug【简单暴力】
  7. OLTP和OLAP
  8. 【python】-- 事件驱动介绍、阻塞IO, 非阻塞IO, 同步IO,异步IO介绍
  9. 我的Android进阶之旅------>Android 标签的用法
  10. activiti基础--3-----------------------------流程实例