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中传递的参数进行编码。

原文地址:https://www.cnblogs.com/mc67/p/4891837.html