含有中文字符的json對象通過jquery提交到mongoose web的亂碼問題

這個函數是把html的表單對象轉換爲Json對象

(function($){

 $.fn.serializeJson=function(){
 var serializeObj={};
 $(this.serializeArray()).each(function(){
 serializeObj[this.name]=this.value;
 });
 return serializeObj;
 };

 })(jQuery);


function fncAppendTask()
{
var data = $("#frmAppendTask").serializeJson();//得到json對象

eval("var str1 = '"+JSON.stringify(data)+"';");


var ajaxDoRet = $.ajax({
    type: "post",   //請求方式
    url: "/cgiAppendNewTask",    //請求的url地址
    dataType: "text",   //返回格式爲text
    async: false, //請求是否異步,默認爲異步,這也是ajax重要特性
    timeout:8000,
    contentType: "application/x-www-form-urlencoded;charset=utf-8", 
     data: str1,    //參數值


   beforeSend: function() {
       var i =1;//請求前的處理
   },
   success: function(req) {
    alert("插入已提交!");
},
   complete: function(XMLHttpRequest,status) {
       //請求完成的處理
       var i = 1;
       //alert(status);
if(status=='timeout')
{//超時,status還有success,error等值的情況
ajaxDoRet.abort();
}
   },
    error: function() {
   var i =1;
       //請求出錯處理
//alert("error");        
   }
});
}

stringify函數會把中文進行URLEncode編碼處理,所以通過eval這種方式再給轉變過來。

本案中,html頁面編碼是gb2312,<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

但事實上,即使在通過jquery提交json對象時候,正確設置了contentType: "application/x-www-form-urlencoded;charset=gb2312", 提交的字符串也是gb2312,到後臺依然會是亂碼(),

一些文章說,只要jqeury提交時候設置了charset,jquery-1.8.3.min.jsjs裏面設置了charset,且兩個一致就可解決編碼問題,經過我驗證,即使這樣,還是會有亂碼。

因爲不管你html頁面編碼是什麼,無論是utf-8,gb2312,因爲jquery在提交時候,會把字符進行unicode編碼處理。這樣,提交到後臺就又亂碼了。

所以索性,在提交時候,用utf-8,提交到後臺以後如果需要多字節字符,用函數再轉換過來。


mongoose web後臺的代碼,本例中,vc後臺工程爲多字節編碼


 if(stricmp(conn->uri, "/cgiAppendNewTask") == 0)
  {
 Json::Value v;



Json::Reader reader;


USES_CONVERSION;
strcpy(szFileContent,W2A(CA2W(conn->content,CP_UTF8)));
 
if(!reader.parse(szFileContent,v))
{
return -1;
}


//這樣,szFileContent裏面就還原出正確的gb2312編碼了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章