代码改变世界

decodeURI()和encodeURI()

2012-05-02 11:21  呦菜  阅读(1316)  评论(0编辑  收藏  举报

在了解以下内容之前先来了解一下什么是URI。

Web上可用的每种资源 - HTML文档、图像、视频片段、程序等 - 由一个通用资源标志符(Uniform Resource Identifier, 简称"URI")进行定位。  URI  可以是Uniform Resource Locator (URL)或Uniform Resource Name(URN)的形式,URL和URN是URI的子集。

 

encodeURI()

URI中的转义字符

摘要:

encodeURI(uri)

参数:

uri:   一个字符串,含有URI或其它要编码的文本。

返回值:uri的副本,其中某些字符被十六进制的转义字符序列替换了。

抛出:

URIError:  说明uri中含有格式化错误的Unicode替代对,不能被编码。

描述:

encodeURI()是全局函数,返回参数uri的编码副本。ASCII的字母和数字不编码,此外下面的ASCII标点符号也不编码:

     - _ . ! ~ * ' ()

因为encodeURI()的目的是给URI进行完整的编码,所以一下在URI中又特殊意义的ASCII标点符号也不转义:

    ; / ? : @ & = + $ , #

uri中得其他字符都将转换成它的UTF-8编码字符,然后用十六进制的转义序列(形式为%xx)对生成的一个、两个或三个字节的字符编码,用它们替换uri中原有的字符。在这种编码模式中ASCII字符由一个%xx转义字符替换,在\u0080到\u07ff之间编码的字符由两个转义序列替换,其它的16位Unicode字符由三个转义序列替换。

如果使用该方法编码URI,应该确保URI组件(如查询字符串)中不含有URI分隔符,如?和#。如果组件中含有这些符号,应该用encodeURIComponent()方法分别对各个组件编码。

用方法decodeURI()可以对该方法进行解码操作。在ECMAScript v3之前,可以用escape()和unescape()方法(反对使用)执行相似的编码解码操作。

例子:

var uri = "http://www.cnblogs.com/youcai/admin&hello world";
document.write(encodeURI(uri));  //  http://www.cnblogs.com/youcai/admin&hello%20world

document.write(encodeURI("\u00a9"));  //  %C2%A9

decodeURI()

URI中为转义的字符

摘要:

decodeURI(uri)

参数:

uri:   一个字符串,含有编码的URI或要其他要解码的文本。

返回值:

uri的副本,其中十六进制的转义序列被它们表示的字符替换。

抛出:

URIError:   说明uri的一个或多个转义序列被错误的格式化,不能被正确解码。

描述:

decodeURI()是一个全局函数,它返回uri解码后的

副本。它将保留encodeURI()方法执行的编码操作。

例子:

var uri = "http://www.cnblogs.com/youcai/admin&hello world";
var encodeUri = encodeURI(uri);
document.write(encodeUri);  //  http://www.cnblogs.com/youcai/admin&hello%20world/admin&hello%20world

document.write("<br>"); 


document.write(decodeURI(encodeUri ));  //  http://www.cnblogs.com/youcai/admin&hello world

encodeURIComponent()

转义URI组件中的字符

摘要:

encodeURIComponent(s)

参数:

s:  一个字符串,含有URI的一部分或其它要编码的文本。

返回值:

s的副本,其中某些字符被十六进制的转义序列替换了。

抛出:

URIError:  说明s中含有格式化错误的Unicode替代对,不能被编码。

描述:

encodeURIComponent()是全局函数,返回参数s的编码副本。ASCII的字母和数字不编码,此外下面的ASCII标点符号也不编码:

    - _ . ! ~ * ' ()

其他字符(像/ 、: #这样用于分割URI各种组件的标点符号 ),都由一个或多个十六进制的转义序列替换。

注意encodeURIComponent()和encodeURI()之间的差别,前者假定它的参数是URI的一部分,因此,它将转义用于分割URI各个部分的标点符号。

例子:

var uri = "hello world?";
document.write(encodeURI(uri));  //  hello%20world?

document.write("<br>"); 


document.write(encodeURIComponent(uri));  //  hello%20world%3F

decodeURIComponent()

URI组件中的未转义字符

摘要:decodeURI(s)

参数:

s:  一个字符串,含有编码URI组件和其他要解码的文本。

返回值:

s的副本,其中十六进制的转义序列被它们所表示的字符替换。

抛出:

URIError: 说明s中的一个或多个转义序列被错误的格式化,不能被正确解码。

描述:

decodeURIComponent()是一个全局函数,它返回参数s解码后的副本。它将保留encodeURIComponent()方法执行的编码操作。

例子:

var uri = "hello world?";

var encodestr = encodeURIComponent(uri);

document.write(encodestr);  //  hello%20world%3F

document.write("<br>");


document.write(decodeURIComponent(encodestr));  //  hello world?