含有中文字符的json对象通过jquery提交到mongoose web的乱码问题

来源:互联网 发布:颜色识别软件下载 编辑:程序博客网 时间:2024/05/17 04:16

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


0 0
原创粉丝点击