1. 程式人生 > >含有中文字元的json物件通過jquery提交到mongoose web的亂碼問題

含有中文字元的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編碼了。