当前位置: 首页 > news >正文

escape()、encodeURI()、encodeURIComponent()区别详解

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("http://cang.baidu.com/bruce42")+'">退出</a>');</script>

对URL中的参数进行编码,因为参数也是一个URL,如果不编码会影响整个URL的跳转。

 

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/07/19/1526687.html

相关文章:

  • Apache(httpd) 报错You don't have permission to access /on this server.
  • 项目开发流程规范文档
  • 存储过程3. 参数的引入
  • UML概况
  • 引入类别解决所有键盘遮挡输入框的问题(iOS Object-C)
  • 对付CC攻击不必动用防火墙df
  • [原创]Fluent NHibernate之旅
  • httpclient Accept-Encoding 乱码
  • 爱人?亲人?
  • iOS 图片保存到系统相册
  • 什么是E1-E1的帧结构-由PCM编码介绍E1
  • 从JDBC程序看为什么需要Mybatis
  • 用心生活,用心感悟!
  • Linux驱动技术(八) _并发控制技术
  • 跟我一起学Visual Studio 2005(18):Crystal Report篇之公式详解 (Level 200)
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 《Java编程思想》读书笔记-对象导论
  • AHK 中 = 和 == 等比较运算符的用法
  • Angularjs之国际化
  • Java 多线程编程之:notify 和 wait 用法
  • JDK 6和JDK 7中的substring()方法
  • PermissionScope Swift4 兼容问题
  • Shadow DOM 内部构造及如何构建独立组件
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • underscore源码剖析之整体架构
  • vue中实现单选
  • 阿里云应用高可用服务公测发布
  • 分享一份非常强势的Android面试题
  • 给github项目添加CI badge
  • 简单基于spring的redis配置(单机和集群模式)
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 使用agvtool更改app version/build
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 项目实战-Api的解决方案
  • 原生js练习题---第五课
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ![CDATA[ ]] 是什么东东
  • (C++17) std算法之执行策略 execution
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (三)终结任务
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)u-boot-nand.bin的下载
  • (转) ns2/nam与nam实现相关的文件
  • (转)3D模板阴影原理
  • ****Linux下Mysql的安装和配置
  • .Net 8.0 新的变化
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Micro Framework 4.2 beta 源码探析
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 中的轻量级线程安全
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • :O)修改linux硬件时间
  • @property括号内属性讲解
  • @WebServiceClient注解,wsdlLocation 可配置