编码 解码

JS之编码解码

escape方法并不编码字符+。而我们知道,在用户提交的表单字段中,如果有空格,则空格会被转化为+字符,而服务器解析的时候则会认为+号代表空格。由于这个缺陷,escape

方法并不能正确地处理所有的非ASCII字符,你应当尽量避免使用escape方法,取而代之,你最好选择encodeURIComponent()方法。

escape()不编码的字符:@*/+


相对于使用escape方法,使用encodeURI方法会显得更专业一些。

当你需要编码整个URI的时候,你可以使用此方法,因为URI中的合法字符都不会被编码转换。需要注意的是字符也是URI中的合法字符,不会被编码转换。

encodeURI() 不编码的字符: ~!@#$&*()=:/,;?+'


encodeURIComponent方法在编码单个URIComponent(指请求参数)中是最常用的。同URIComponent,字符 ’ 也是URI中的合法字符,同样不会被编码转换。

encodeURIComponent()不编码的字符: ~!*()'

 

因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用 escape。

如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者 encodeURIComponent。


另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有


————————————————————————————————————————————————————————


.Net之编码解码

茄子_2008反馈他博客中的“C++”标签失效。检查了一下代码,生成链接时用的是HttpUtility.UrlEncode(url),从链接地址获取标签时用的是HttpUtility.UrlDecode(url),从Encode到Decode,“C++”变成了“C  ”(加号变成空格)。这是大家熟知的问题,这里我们分析一下这个问题,并给出解决方法。

问题发生的过程:

1. 原始链接:

  
  
http://www.cnblogs.com/xd502djj/tag/C++/

2. HttpUtility.UrlEncode之后,得到:

  
  
http://www.cnblogs.com/xd502djj/tag/C%2b%2b/

3. Request.RawUrl,得到:

  
  
http://www.cnblogs.com/xd502djj/tag/C++/

4. HttpUtility.UrlDecode,得到:

  
  
http://www.cnblogs.com/xd502djj/tag/C /

上面第3步已经得到正确的结果,第4步的UrlDecode反而将加号变为了空格。

看来解决方法很简单,取消多此一举的UrlDecode,开始我们也是这么干的。过了一段时间,有用户反映“Windows Phone”的标签失效了,变成了“Windows+Phone”。我们一查,原来是在HttpUtility.UrlEncode时,空格被转换为加号,需要调用UrlDecode将加号还原为空格,于是又把HttpUtility.UrlDecode加上(忘了之前的“C++”标签问题)。然后,“C++”标签又失效...这样反反复复,看似Bug很多,工作很忙,实际上就是一个Bug...

终于有一天,我们说“再也不能这样过”,开始寻找解决方案:

既然HttpUtility.UrlEncode()不能用,那在.NET中找找有没有替代品。

先找到了HttpUtility.UrlPathEncode()。嘿,有用,轻松搞定“C++”与空格问题,但是...后来发现搞不定“C#”,它没有对“#”进行编码。

继续寻找...找到了Uri.EscapeUriString(),与HttpUtility.UrlPathEncode()同样的问题。

继续寻找...终于找到了...Uri.EscapeDataString(),搞定!请看下面的测试代码:

public void UrlEncodeTest()
{
    string url = "C++ C#";
    Console.WriteLine(HttpUtility.UrlEncode(url));//C%2b%2b+C%23
    Console.WriteLine(HttpUtility.UrlPathEncode(url));//C++%20C#
    Console.WriteLine(Uri.EscapeUriString(url));//C++%20C#
    Console.WriteLine(Uri.EscapeDataString(url));//C%2B%2B%20C%23
}
注:运行环境.NET4。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值