URL编码中的空格问题

 

在调查一个错误的时候,偶然发现HTML页面中的部分Link含有+,将tag反编译了一下,发现是因为调用了java.net.URLEncoder的方法

public static String encode(String s, String enc)

从代码中可以很清晰的看到还特别照顾的将' '转成了'+'。由于印象中的URL编码规则应该是将空格转为%20,就google了一把,结果发现很多人都遇到了这个问题,但基本都是语焉不详。

花了1个多小时仔细搜索了一遍,线索如下:

1、在sun的bug库中找到有人认为该方法不符合RFC2396标准
http://bugs.sun.com/view_bug.do?bug_id=4616184
sun的回答说不是bug,符合HTML4.01标准

2、在W3C找到HTML标准的说明
http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4
在这里清楚的看到编码方式是根据ContextType的不同而区别对待的,在form的ContextType是[x-www-form-urlencoded]的时候会对form中的键/值对进行编码,空格被转义成+,其他字符按照[RFC1738]标准处理成%HH的形式。

3、回头再看URLEncoder
发现该类的注释中很明确的写明了:
converting a String to the application/x-www-form-urlencoded MIME format

从以上的结果看来%20似乎只是在使用上的一个误解,因为%20可以被解析成空格,所以就理所当然的认为空格应该被转义为%20。

再进一步,对Java/.Net/JavaScript的相关函数进行下测试,结果发现Java(1.5)与.Net(2.0)的情况一致,但JavaScript的函数还是将空格转换成了%20。看来这个问题的误解完全来自于js的错误……

 

public   static   void  main(String[] args)  {
    
try {
        System.out.println(URLEncoder.encode(
"Hello World","UTF-8"));
        System.out.println(URLDecoder.decode(
"Hello+World","UTF-8"));
        System.out.println(URLDecoder.decode(
"Hello%20World","UTF-8"));
    }
 catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

}

 

static   void  Main()
{
      Console.WriteLine(HttpUtility.UrlEncode(
"Hello World"));
      Console.WriteLine(HttpUtility.UrlDecode(
"Hello World"));
      Console.WriteLine(HttpUtility.UrlDecode(
"Hello%20World")); 
}


< script language = " JavaScript "  type = " text/javascript " >
  document.write(escape(
' Hello World ' +   ' <BR> ' );
  document.write(unescape(
' Hello+World ' +   ' <BR> ' );
  document.write(unescape(
' Hello%20World ' ));
</ script >

<script type=text/javascript>AddFeedbackCountStack("2300225")</script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值