emu in blogjava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  171 随笔 :: 103 文章 :: 1052 评论 :: 2 Trackbacks
在跨业务、跨网站发送数据或者业务升级的时候,我们有的时候需要指定发送数据的编码方式,比如页面是utf-8编码的,而发送出去的数据却是GB2312编码的。在做Ajax开发的时候,我们往往都是用vbscript或者用查字典法来解决这个问题(http://www.blogjava.net/emu/articles/31756.html)。但是有些业务,也许并不需要做成Ajax这么复杂,用表单提交显得更加自然。

其实html里面form标签有个accept-charset属性,可以帮助我们解决这个问题,可惜的是傻乎乎的IE浏览器虽然认得accept-charset,却并不卖它的帐。IE的表单提交的时候使用什么编码是完全看页面的charset决定的。还好,IE在charset这个问题上一傻到底(见http://www.blogjava.net/emu/archive/2007/08/21/138247.html),糊弄它一下,它就乖乖听话了:
<HTML>
<HEAD>
    
<meta http-equiv=content-type content="text/html; charset=UTF-8">
    
<SCRIPT LANGUAGE="JavaScript">
        
var isIE=!!window.ActiveXObject;
        
if(isIE && document.charset!="utf-8")location.reload(false);
        
if(location.search) alert("“我”字编码为:"+location.search.substr(6))
    
</SCRIPT>
    
<TITLE>encode before form post</TITLE>
    
<META NAME="Author" CONTENT="emu">
</HEAD>
<BODY>
    
<form action="#" accept-charset="GB2312" onsubmit="if(isIE)document.charset='GB2312'">
        
<input name="test" value="我" readonly>
        
<input type=submit>
    
</form>
</BODY>
</HTML>

简单的讲,就是在表单发送前告诉IE说当前页面是GB2312编码就行了:
 <form accept-charset="GB2312" onsubmit="if(isIE)document.charset='GB2312'">
accept-charset="GB2312" 是写给其他没那么笨的浏览器看的。

IE为了表现它确实是一傻到底,不但在设置document.charset的时候不会用新的编码解释页面,还会在前进后退(我特地用#作为action来实现后退)的时候又尝试用新的编码去解释页面。不过还好,可以用脚本判断出来,还可以用脚本刷新一下页面解决这个问题:
if(isIE && document.charset!="utf-8")location.reload(false);
posted on 2008-01-31 17:31 emu 阅读(4263) 评论(5)  编辑  收藏

评论

# re: 在IE下面指定表单编码方式 2008-02-17 12:49 93ttp
不错,好东西  回复  更多评论
  

# re: 在IE下面指定表单编码方式 2009-05-15 17:18 魔兽私服
这个BUG我没有遇到过哦,只有高级的人才遇到的吧?  回复  更多评论
  

# 十分强大 2009-06-19 19:04 十分强大
十分强大  回复  更多评论
  

# re: 在IE下面指定表单编码方式 2011-08-17 15:12 回转窑
谢谢分享 很不错 、、  回复  更多评论
  

# re: 在IE下面指定表单编码方式 2011-09-09 01:04
太好了,顶你,我还在烦这个问题呢,虽然没有太大的影响。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: