JavaScript及C# URI编码
为什么要对URI进行编码?
通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。
例如,Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。
又如,Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。
Url编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。
JavaScript中的编码与解码
不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码。如果程序员要把每一种结果都考虑进去,
是不是太恐怖了?有没有办法,能够保证客户端只用一种编码方法向服务器发出请求?有没有办法,能够保证客户端只用一种编码方法向服务器发出请求?
回答是有的,就是使用Javascript先对URL编码,然后再向服务器提交,不要给浏览器插手的机会。因为Javascript的输出总是一致的,所以就保证了服务器得到的数据是格式统一的。
1.escape() --unescape()
它的具体规则是,除了ASCII字母、数字、标点符号"@ * _ + - . /"以外,对其他所有字符进行编码
function escapeInfo(){ var val="中国"; var str=escape(val); //%u4E2D%u56FD var val=unescape(str); //中国 }
1.首先,无论网页的原始编码是什么,一旦被Javascript编码,就都变为unicode字符。也就是说,Javascipt函数的输入和输出,默认都是Unicode字符
2.escape()不对"+"编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心
2.encodeURI()--decodeURI()
encodeURI()是Javascript中真正用来对URL编码的函数。
它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号"; / ? : @ & = + $ , #",也不进行编码。编码后,
它输出符号的utf-8形式,并且在每个字节前加上%。
function encodeURIInfo(){ var url='http://www.cnblogs.com/mc67?Id=12'; var str=encodeURI(url); //http://www.cnblogs.com/mc67?Id=12 var url=decodeURI(str); //http://www.cnblogs.com/mc67?Id=12 }
3.encodeURIComponent()--decodeURIComponent()
1.encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码
2.因此,"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样.
function encodeURIComponentInfo(){ var str ='http://www.cnblogs.com/mc67?Id=12$name='+encodeURIComponent('刘奇') //http://www.cnblogs.com/mc67?Id=12$name=%E5%88%98%E5%A5%87 var url=decodeURIComponent(str); //var str ='http://www.cnblogs.com/mc67?Id=12$name='+encodeURIComponent('刘奇') }
C#中的编码和解码
方法一:
1.设置web.config文件。
<system.web>
......
<globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" />
......
</system.web>
方法二:
1.HttpUtility.UrlEncode()默认是以UTF8对URL进行编码。
2.Server.UrlEncode是使用系统预设格式编码
问题:
因为 HttpUtility.UrlEncode 在 Encode 的时候, 将空格转换成加号('+'), 在 Decode 的时候将加号转为空格, 但是浏览器是不能理解加号为空格的, 所以如果文件名包含了空格, 在浏览器下载得到的文件, 空格就变成了加号.
解决:
在 HttpUtility 的 UrlEncode 之后, 将 "+" 替换成 "%20"( 如果原来是 "+" 则被转换成 "%2b" ) , 如:
fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
fileName = fileName.Replace("+", "%20");
不明白微软为什么要把空格转换成加号而不是"%20". 记得 JDK 的 UrlEncoder 是将空格转换成 "%20"的.
经检查, 在 .Net 2.0 也是这样.
Uri.EscapeUriString:用于对网址编码(不包含参数)
Uri.EscapeDataString:用于对网址参数进行编码
在C#中推荐的做法是用Uri.EscapeUriString对URI的网址部分编码,用Uri.EscapeDataString对URI中传递的参数进行编码。