escape、encodeURI 和 encodeURIComponent 的区别


Posted in Javascript onMarch 02, 2009

escape() 方法

MSDN JScript Reference中如是说:

The escape method returns a string value (in Unicode format) that contains the contents of [the argument]. All spaces, punctuation, accented characters, and any other non-ASCII characters are replaced with %xx encoding, where xx is equivalent to the hexadecimal number representing the character. For example, a space is returned as "%20."

鄙人译:escape方法以Unicode格式返回一个包含传入参数内容的string类型的值。 Escape方法会将传入参数中所有的空格、标点符号、重音字符以及其它任何非ASCII字符替换为%xx的编码形式,其中xx与其所表示的字符的16进制数表示形式相同。如空格字符的16进制表示形式为0x20,则此时xx应为20,即escape(‘ ') 返回“%20”。

Mozilla Developer Core Javascript Guide中如是说:

The escape and unescape functions let you encode and decode strings. The escape function returns the hexadecimal encoding of an argument in the ISO Latin character set. The unescape function returns the ASCII string for the specified hexadecimal encoding value.

鄙人译:escape和unescape方法能够帮助你编码和解码字符串。escape方法对于ISO Latin字符集中的字符组成的参数,返回其16进制编码。相对应的,unescape方法则能将16进制编码形式的参数转化成为其ASCII码形式。

encodeURI()方法

MSDN JScript Reference中如是说:

The encodeURI method returns an encoded URI. If you pass the result to decodeURI, the original string is returned. The encodeURI method does not encode the following characters: ":", "/", ";", and "?". Use encodeURIComponent to encode these characters.

鄙人译:encodeURI方法返回一个经过编码的URI。如果将encodeURI方法的编码结果传递给decodeURI方法作参数,则能得到原始的未编码的字符串。需要注意到是encodeURI方法不编码如下字符":", "/", ";", and "?"。如果想要编码这些字符,请使用encodeURIComponent方法。

Mozilla Developer Core Javascript Guide中如是说:

Encodes a Uniform Resource Identifier (URI) by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF-8 encoding of the character.

鄙人译:通过将每个属于特定的字符集合的字符替换为一个、两个或者三个(为什么是“一个、两个或者三个”本人也没有搞懂,望高人赐教)使用UTF-8编码来表示这个字符的escape序列来编码一个URI。如 ~!@#$%^&*(){}[]=:/,;?+\'"\\ 将被替换为 ~!@#$%25%5E&*()%7B%7D%5B%5D=:/,;?+'%22%5C

encodeURIComponent()方法

MSDN JScript Reference中如是说:

The encodeURIComponent method returns an encoded URI. If you pass the result to decodeURIComponent, the original string is returned. Because the encodeURIComponent method encodes all characters, be careful if the string represents a path such as /folder1/folder2/default.html. The slash characters will be encoded and will not be valid if sent as a request to a web server. Use the encodeURI method if the string contains more than a single URI component.

鄙人译:encodeURIComponent方法返回一个编码过的URI。如果将encodeURIComponent方法的编码结果传递给encodeURIComponent方法作参数,则能得到原始的未编码的字符串。因为encodeURIComponent方法会编码所有的字符,所以如果待编码的字符串是用来表示一个路径(如/dir1/dir2/index.htm)时,就一定要小心使用了。‘/'符号会被其编码之后,将不再是一个有效的路径标识符,所以不能被web服务器正确地识别。当字符串包含一个单独的URI component(指?后面的请求参数)的时候,请使用此方法。

Mozilla Developer Core Javascript Guide中如是说:

Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF-8 encoding of the character.

鄙人译:通过将每个属于特定的字符集合的字符替换为一个、两个或者三个(为什么是“一个、两个或者三个”本人也没有搞懂,望高人赐教)使用UTF-8编码来表示这个字符的escape序列来编码一个URIComponent。

有什么区别?何时使用?

通过上面的介绍可以看出,MS的文档明显要比Mozilla详细、易懂一些,但是它们表达的都是一个意思。但是escape(), encodeURI()和 encodeURIComponent()有什么异同,它们分别适用于那种特定的情况呢?

escape方法并不编码字符+。而我们知道,在用户提交的表单字段中,如果有空格,则会被转化为+字符,而服务器解析的时候则会认为+号代表空格。由于这个缺陷,escape方法并不能正确地处理所有的非ASCII字符,你应当尽量避免使用escape方法,取而代之,你最好选择encodeURIComponent()方法。

escape()不编码的字符:@*/+

相对于使用escape方法,使用encodeURI方法会显得更专业一些。当你需要编码一整个URI的时候,你可以使用此方法,因为URI中的合法字符都不会被编码转换。需要注意到是字符'也是URI中的合法字符,所以也不会被编码转换。

encodeURI() 不编码的字符: ~!@#@{content}*()=:/,;?+'

encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的。需要注意到是字符'也是URI中的合法字符,所以也不会被编码转换。

encodeURIComponent()不编码的字符: ~!*()'

Javascript 相关文章推荐
找出字符串中出现次数最多的字母和出现次数精简版
Nov 07 Javascript
javascript中的onkeyup和onkeydown区别介绍
Apr 28 Javascript
JavaScript 和 Java 的区别浅析
Jul 31 Javascript
JavaScript制作简单的日历效果
Mar 10 Javascript
Js 获取当前函数参数对象的实现代码
Jun 20 Javascript
jquery中live()方法和bind()方法区别分析
Jun 23 Javascript
AngularJS实现按钮提示与点击变色效果
Sep 07 Javascript
实现JavaScript高性能的数据存储
Dec 11 Javascript
D3.js进阶系列之CSV表格文件的读取详解
Jun 06 Javascript
three.js实现3D视野缩放效果
Nov 16 Javascript
layui table 参数设置方法
Aug 14 Javascript
javascript实现放大镜功能
Dec 09 Javascript
javascript 文档的编码问题解决
Mar 01 #Javascript
jQuery Div中加载其他页面的实现代码
Feb 27 #Javascript
jQuery 使用个人心得
Feb 26 #Javascript
javascript div 弹出可拖动窗口
Feb 26 #Javascript
javascript URL锚点取值方法
Feb 25 #Javascript
javascript 特殊字符串
Feb 25 #Javascript
javascript 密码强弱度检测万能插件
Feb 25 #Javascript
You might like
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
pyqt5实现登录界面的模板
2020/05/30 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
pyCharm 实现关闭代码检查
2020/06/09 Python
新手学python应该下哪个版本
2020/06/11 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
python 实现图片批量压缩的示例
2020/12/18 Python
python中pyqtgraph知识点总结
2021/01/26 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
五一服装活动方案
2014/01/11 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
个人承诺书格式
2014/06/03 职场文书
场地使用证明模板
2014/10/25 职场文书
Python实现天气查询软件
2021/06/07 Python
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电