获取form post的charset【改造版】

前面提到过我的一个低级失误并对servlet的setCharacterEncoding有了正确认识。

 

主要是基于这么一个思路解决我的问题: 


<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>
...

<form method="post" action="/servlet" accept-charset="utf-8">
<input type="hidden" name="_charset_"/>
<input type="text" name="text"/>
<input type="submit" value="Submit"/>
</form>

  

 

 

这个表单配合原来在weblogic下写的filter代码,在IE和firefox下运行正常。但既然遵循servlet规范,不能在filter中通过_charset_这个request参数来获取浏览器对post body的真实编码,只能想点歪门邪道了。向jsessionid取经,这个表单改成这样:(关于URL中的分号,请参考RFC1738,这里有个中文版

 

<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>

...
<form method="post" action="/servlet;_charset_=utf-8" accept-charset="utf-8">
<input type="hidden" name="_charset_"/>
<input type="text" name="text"/>
<input type="submit" value="Submit"/>
</form>

 

 

 

 filter的改造就略了,无非是hack下request uri。幸好遗留应用并不需要url中重写jsessionid。wink

 

测试,运行,firefox正常了,IE又不正常。哦,恍然大雾啊,原来firefox是严格的根据accept-charset来编码,若accept-charset不存在,则按response或者meta http-equiv="Content-Type"中的声明来编码,最后把编码方式放到_charset_隐藏域。而IE还是顽固的只按照response或者meta http-equiv="Content-Type"中的声明来编码,并把编码方式放到_charset_隐藏域。原来IE无视accept-charset的存在。我原先一直以为_charset_隐藏域只是IE对accept-charset的一个强制辅助呢,又一个一知半解的典型...

 

得了,只能让firefox和IE同流合污了。最终,表单变成这样:

 

<meta http-equiv="Content-Type" content="text/html; charset=gbk"/>

...
<form method="post" action="/servlet;_charset_=gbk">
<input type="text" name="text"/>
<input type="submit" value="Submit"/>
</form>

 

在IE和firefox下均测试通过。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值