js对url进行编码和解码

JavaScript014

js对url进行编码和解码,第1张

*** 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不经过编码直接用于 URL。

***例如:搜索的中文关键字,复制网址之后再粘贴就会发现该URL已经被转码。

1、escape 和 unescape

原理:对除ASCII字母、数字、标点符号 @  *  _  +  -  .  / 以外的其他字符进行编码。

编码:escape('http://www.baidu.com?name=zhang@xiao@jie&order=1')

 结果:"http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D1"

 escape('张')

 结果:"%u5F20"

解码:unescape("http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D1")

 结果:"http://www.baidu.com?name=zhang@xiao@jie&order=1"

 unescape("%u5F20")

 结果:"张"

2、encodeURI 和 decodeURI

原理:返回编码为有效的统一资源标识符 (URI) 的字符串,不会被编码的字符:! @ # $ &* ( ) = : / ? + '

  encodeURI()是Javascript中真正用来对URL编码的函数。

编码:encodeURI('http://www.baidu.com?name=zhang@xiao@jie&order=1')

 结果:"http://www.baidu.com?name=zhang@xiao@jie&order=1"

解码:decodeURI("http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D1")

 结果:"http%3A//www.baidu.com%3Fname%3Dzhang@xiao@jie%26order%3D1"

3、encodeURIComponent 和 decodeURIComponent

原理:对URL的组成部分进行个别编码,而不用于对整个URL进行编码

编码:encodeURIComponent('http://www.baidu.com?name=zhang@xiao@jie&order=1')

结果:"http%3A%2F%2Fwww.baidu.com%3Fname%3Dzhang%40xiao%40jie%26order%3D1"

解码:decodeURIComponent("http%3A%2F%2Fwww.baidu.com%3Fname%3Dzhang%40xiao%40jie%26order%3D1")

 "http://www.baidu.com?name=zhang@xiao@jie&order=1"

虽然escape()、encodeURI()、encodeURIComponent()三种方法都能对一些影响URL完整性的特殊

字符进行过滤。但后两者是将字符串转换为UTF-8的方式来传输,解决了页面编码不一至导致的乱码问

题。例如:发送页与接受页的编码格式(Charset)不一致(假设发送页面是GB2312而接收页面编码是

UTF-8),使用escape()转换传输中文字串就会出现乱码问题。

以下是JS下对URL进行编/解码的各种方法:

escape

方法:返回一个可在所有计算机上读取的编码

String

对象。

function

escape(charString

:

String)

:

String

不会被此方法编码的字符:

@

*

/

+

说明:escape

方法返回一个包含

charstring

内容的字符串值(Unicode

格式)。所有空格、标点、

重音符号以及任何其他非

ASCII

字符都用

%xx

编码替换,其中

xx

等于表示该字符的十六进制数。

例如,空格返回为“%20”。(字符值大于

255

的字符以

%uxxxx

格式存储。)

注意:escape

方法不能用来对“统一资源标识符”(URI)

进行编码。对其编码应使用

encodeURI

encodeURIComponent

方法。

encodeURI

方法:返回编码为有效的统一资源标识符

(URI)

的字符串。

function

encodeURI(URIString

:

String)

:

String

不会被此方法编码的字符:!

@

#

$

&

*

(

)

=

:

/

?

+

'

说明:encodeURI

方法返回一个已编码的

URI。如果将编码结果传递给

decodeURI,则将返回初始的

字符串。encodeURI

不对下列字符进行编码:“:”、“/”、“”和“?”。请使用

encodeURIComponent

对这些字符进行编码。

encodeURIComponent

方法:返回编码为统一资源标识符

(URI)

的有效组件的字符串。

function

encodeURIComponent(encodedURIString

:

String)

:

String

不会被此方法编码的字符:!

*

(

)

'

说明:encodeURIComponent

方法返回一个已编码的

URI。如果将编码结果传递给

decodeURIComponent,则将返回初始的字符串。因为

encodeURIComponent

方法将对所有字符编码,

请注意,如果该字符串代表一个路径,例如

/folder1/folder2/default.html,则其中的斜杠也将被

编码,这样,当该字符串作为请求发送到

Web

服务器时它将是无效的。如果字符串中包含多个

URI

组件,请使用

encodeURI

方法进行编码。

unescape

方法:从用

escape

方法编码的

String

对象中返回已解码的字符串。

function

unescape(charString

:

String)

:

String

说明:unescape

方法返回一个包含

charstring

内容的字符串值。所有以

%xx

十六进制形式编码的

字符都用

ASCII

字符集当中等效的字符代替。(以

%uxxxx

格式(Unicode

字符)编码的字符用十六

进制编码

xxxx

Unicode

字符代替。)

注意:unescape

方法不应用于解码“统一资源标识符”(URI)。请改用

decodeURI

decodeURIComponent

方法。

decodeURI

方法:返回一个已编码的统一资源标识符

(URI)

的非编码形式。

function

decodeURI(URIstring

:

String)

:

String

decodeURIComponent

方法:返回统一资源标识符

(URI)

的一个已编码组件的非编码形式。

function

decodeURIComponent(encodedURIString

:

String)

:

String

BTW:C#中对URL编码的方法。。。

编码:Server.UrlEncode(string)

解码:Server.UrlDecode(string)

前面三种客户端编码都可以用这个方法在后台解码。