終極解決MagicAjax提交中文表單亂碼的問題(轉)

轉自:http://community.hf-mstc.org/cs/blogs/shakewang/archive/2006/07/06/2931.aspx

上次,我遇到的 MagicAjax的中文問題, 當初爲了演示,只是臨時的使用了數字來繞過中文提交的問題,但不是最終的解決方法。今天終於忍不住這個亂碼了,就打算解決它。先是到網上搜索一下,但都是說的另外一個問題。大部分人都是說把 magicajax post數據時的那個“loading...”修改成中文,出現亂碼,這個好解決,這個漢字在 AjaxCallObject.js 文件裏,直接把AjaxCallObject.js文件保存成utf-8就解決了。

我的問題是:頁面上假如有個文本框,輸入的是漢字,那麼使用magicajax去提交數據到後臺,在後臺獲取到的是亂碼。打開magicajax的源碼,找到 AjaxCallObject.js文件(之所以還是直接找這個文件,是因爲ajax提交數據首先是通過js調用xmlhttp對象,將數據post到後臺的,那麼,就看看magicajax是不是把這個提交的數據進行了處理),找到使用xmlhttp提交的這段:

AjaxCallObject.prototype.DoAjaxCall =
function(eventTarget, eventArgument, ajaxCallType, ajaxScopeID, additionalData) {...... this.XmlHttp.open("POST", thePage, true); this.XmlHttp.onreadystatechange = function(){ oThis.ReadyStateChange(); }; this.XmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); this.XmlHttp.send(theData); }

可以看出在這裏提交了theData數據,我用alert(theData)的方法將數據在提交前顯示出來,發現提交的數據都直接顯示是中文,然後再跟蹤程序到後臺,發現就已經是亂碼了,這說明這個 AjaxCallObject.js 本身並沒有對這個post的數據進行編碼處理。

然後,就好辦了,使用jscript裏的 escape()函數將待post的數據在提交前編碼一下,就不會出現中文了。代碼如下:

if ( __bPageIsStored && eName == '__VIEWSTATE' ) continue; var type = curElem.type; var val = curElem.value; //這裏對待提交的中文進行編碼 //wangzhen 2006-07-06 val = escape(val); if ( type == "submit" || type == "button" ) continue; val = this.EncodePostData(val); if ( type == "select-multiple" || type == "select-one" ) { var selectLength = curElem.options.length; var optNameStr = this.EncodePostData(eName); for (var j=0; j < selectLength; j++) if (curElem.options[j].selected) theData = theData + optNameStr + '='
+ escape(curElem.options[j].value) + '&';
//當頁面裏有dropdownlist時,還有這裏的編碼也要處理 } else if ( (type != "checkbox" && type != "radio") || curElem.checked ) { theData = theData + this.EncodePostData(eName) + '=' + val + '&'; }

除此之外,還要找到如下這段代碼並按註釋修改:

AjaxCallObject.prototype.EncodePostData = function(data) { //由於已經使用了escape方法對postback的值進行了編碼,這裏不再替換“%” //wangzhen 2006-07-06 //return data.split("%").join("%25").split("=").join("%3d").
//split("&").join("%26").split("+").join("%2b");
return data.split("=").join("%3d").split("&").join("%26").split("+").join("%2b"); }

這樣就解決了所有的中文亂碼問題! 

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章