在跨業務、跨網站發送數據或者業務升級的時候,我們有的時候需要指定發送數據的編碼方式,比如頁面是utf-8編碼的,而發送出去的數據卻是GB2312編碼的。在做Ajax開發的時候,我們往往都是用vbscript或者用查字典法來解決這個問題(
http://www.tkk7.com/emu/articles/31756.html)。但是有些業務,也許并不需要做成Ajax這么復雜,用表單提交顯得更加自然。
其實html里面form標簽有個accept-charset屬性,可以幫助我們解決這個問題,可惜的是傻乎乎的IE瀏覽器雖然認得accept-charset,卻并不賣它的帳。IE的表單提交的時候使用什么編碼是完全看頁面的charset決定的。還好,IE在charset這個問題上一傻到底(見
http://www.tkk7.com/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);