x-www-form-urlencoded的解码

问题发生于,我想用tcpmon拦截页面提交数据。
由于post的数据都是经过urlencoded编码的,所以看到的数据如果是日文的话都是类似于“%8Ex%95%A5%8B%E0%8Az%8D%87%8Cv”这个样子的。
我想把它解码成原始数据,以便于调查。
于是使用了URLDecoder.decode方法进行解码,发现解码回来的数据有误

System.out.println(URLDecoder.decode("%8Ex%95%A5%8B%E0%8Az%8D%87%8Cv","windows-31j"));

输出结果为
[code]支?金?合?[/code]
正确结果应该为
[code]支払金額合計[/code]
于是使用
System.out.println(URLEncoder.encode("支払金額合計","windows-31j"));

把这几个字符编码了一下,得到的结果是
[code]%8E%78%95%A5%8B%E0%8A%7A%8D%87%8C%76[/code]
和上面的比较了一下确实有些不一样
下面几个编码好像变成了字幕
[code]
%78 ->x
%7A ->z
%76 ->z
[/code]
用下面代码解码一下也确实如此

System.out.println(URLDecoder.decode("%78","windows-31j"));
System.out.println(URLDecoder.decode("%7A","windows-31j"));
System.out.println(URLDecoder.decode("%76","windows-31j"));


但是问题是,为什么浏览器编码时和URLEncoder.encode编码是不一样的呢?为什么Tomcat可以正确的解码呢?
调查了一下才发现Tomcat根本不是用的URLDecoder.decode来解码的,而是用的org.apache.catalina.util.RequestUtil类。
这样解码一下发现都能得到正确的结果

System.out.println(RequestUtil.URLDecode("%8Ex%95%A5%8B%E0%8Az%8D%87%8Cv","windows-31j"));
System.out.println(RequestUtil.URLDecode("%8E%78%95%A5%8B%E0%8A%7A%8D%87%8C%76","windows-31j"));


至于为什么,查看一下两个类的源代码就一清二楚了。
至于为什么要这样做,我想是出于减少浏览器和服务器之间的传输数据量的考虑。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值