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