这个函数是把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编码了。