***例如:搜索的中文关键字,复制网址之后再粘贴就会发现该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"
通过以下两种方式都可以编码和解码1、
用JS对URL进行编码和解码
JavaScript中有三个可以对字符串编码的函数,分别是:
escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent。
escape()
函数可对字符串进行编码
语法
escape(string)
encodeURI()
函数可把字符串作为
URI
进行编码。
语法
encodeURI(URIstring)
该方法的目的是对
URI
进行完整的编码,因此对以下在
URI
中具有特殊含义的
ASCII
标点符号,encodeURI()
函数是不会进行转义的:/?:@&=+$,#
encodeURIComponent()
函数
encodeURIComponent()
函数可把字符串作为
URI
组件进行编码。
escape()除了
ASCII
字母、数字和特定的符号外,对传进来的字符串全部进行转义编码,因此如果想对URL编码,最好不要使用此方法。而encodeURI()
用于编码整个URI,因为URI中的合法字符都不会被编码转换。encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,它可以讲参数中的中文、特殊字符进行转义,而不会影响整个URL。
2、用asp.net
对URL进行编码和解码
用System.Web.HttpUtility.UrlEncode编码:
string
tmp1
=
System.Web.HttpUtility.UrlEncode(".net技术",
System.Text.Encoding.GetEncoding("GB2312"))
string
tmp2
=
System.Web.HttpUtility.UrlEncode(".net技术",
System.Text.Encoding.UTF8)
用System.Web.HttpUtility.UrlDecode
或者
Server.UrlEncode
相应的进行解码
参考资料:
URL如何编码与解码
http://www.studyofnet.com/news/167.html
一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址" http://www.abc.com ",但是没有希腊字母的网址" http://www.a βγ.com"(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738做了硬性规定(只有字母和数字[0-9a-zA-Z]、一些特殊符号"$-_.+!*'(),"[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。)
这意味着,如果URL中有汉字或者其他特殊字符,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给浏览器自己决定。这导致不同浏览器对特殊字符的编码方式不同。
举个例子:
我在谷歌浏览器输入 http://www.baidu.com?a=测试 ,可以发现查询字符串, 测试 已经被编码成 %E6%B5%8B%E8%AF%95
参考 阮一峰老师文章关于URL编码 ,里面介绍使用ie8会出现编码结果不同,由于我的电脑没有ie8,所以没法测试。不过我试了360、搜狗,和谷歌测试的结果一样。
而火狐直接显示的是中文:
上面只是统一操作系统的浏览器,如果不同操作系统等,肯定会出现其他编码方式。所以我们在使用url的时候需要一个统一的编码方式(即使用Javascript先对URL编码,不用浏览器自己来编码。因为Javascript的输出总是一致的,服务器获取查询参数等数据,再用对应的解码函数进行解码)
Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape()。虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起。
1. escape() / unescape()
规则:除了ASCII字母、数字、标点符号"@ * _ + - . /"以外,对其他所有字符进行编码(注:空格会被转化为+字符)
注:
2. encodeURI() / decodeURI()
3.encodeURIComponent() / decodeURIComponent
阮一峰老师文章关于URL编码
简单明了区分escape、encodeURI和encodeURIComponent