首页蓝耳朵|小小蓝耳朵广州图书馆外文室英语儿童读物资源介绍网佛教青年之友旧版收集永硕E盘Phonics Short Vowels Game 
用js提交(post)数据后中文变乱码的解决办法
所属栏目:ASP.NET(webform)  时间:2010-01-15 10:59  作者:狼子

问题描述:

使用vs.net2005开发,所有文件默认新建时的文件编码为:aspx文件是gb2312,cs、js文件是utf-8

我的网站使用的统一编码是gb2312,在web.config里设置了:
<globalization requestEncoding="gb2312" responseEncoding="gb2312" />

我在js里,向aspx页面提交数据,想要从这个页面获取返回值,然后呢,如果我提交的数据是中文,在aspx.cs页面里获取的数据就会变成乱码

最快手的解决办法:

把网站统一编码改成utf-8,就是故意设置网站统一编码,肯定是有原因的,对不对?这样子改法,要求整个网站都统一了。。。

没用的解决办法:

我试过在提交文件时,js里设置

request.setRequestHeader("contentType","text/html;charset=gb2312");

然后呢,我把所有相关文件,调用js的aspx页面和它的cs文件、js文件、接收文件和它的cs文件全部指定编码是gb2312另存

我还试过在js里用各种方法加密参数,在cs里使用Server.UrlDecode解码,还是乱码

最后想到的是要指定编码解码,就是,我熟悉的UrlDecode和HtmlDecode都只有两个重载,不可以指定编码解码,大猫找到HttpUtility.UrlEncode,问题解决

解决办法:

在js里指定编码提交数据,对要提交的数据要进行两次加密
在aspx.cs里,要指定编码对获取的数据解码

原因:

Request.Form获取数据时,默认已经对数据进行一次解码了的,如果在js里只加密一次,在aspx.cs页面里获取的数据就是直接乱码,只有加密两次,才可以获取到已编码的数据,才可以对数据进行指定编码解码

代码:

js文件:

submitData("文件名", "myValue='中国'");

//提交数据:参数、地址
function submitData(submitPage, parmAndValue)
{  
    //使用表单请求页面
    request = new createXMLHttpRequest();
    request.open("POST", submitPage, false);
    request.setrequestheader("cache-control","no-cache");
    request.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
    request.setRequestHeader("contentType","text/html;charset=utf-8");
    request.setRequestHeader("RequestType","ajax");
    //提交,二次编码,防止request.form默认解码
    parmAndValue = encodeURI(parmAndValue);
    parmAndValue = encodeURI(parmAndValue);
    request.send(parmAndValue);
    //取返回的字条串返回
    var result = request.responseText;
    return result;
}

//创建XMLHttpRequest对象
function createXMLHttpRequest() //创建XMLHttpRequest对象
{
    if (window.ActiveXObject)   // IE下创建XMLHTTPREQUEST
    {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest)   // 其他浏览器创建XMLHTTPREQUEST
    {
        xhr = new XMLHttpRequest();
    }
    return xhr;
}

 

aspx.cs文件:

string myValue;
myValue = Request.Form["myValue"];
Response.Write("接收:myValue=" + myValue + "\n");
myValue = System.Web.HttpUtility.UrlDecode(myValue, System.Text.Encoding.UTF8);
//myValue = Server.UrlDecode(myValue);
Response.Write("解码:myValue=" + myValue + "\n");
Response.End();

记录一些网址:

HttpUtility.UrlEncode 方法 (String, Encoding)
http://msdn.microsoft.com/zh-cn/library/h10z5byc(VS.80).aspx

setRequestHeader() 的进一步探索
http://hi.baidu.com/%C4%E3%CA%C7%B1%E0%B3%CC%B8%DF%CA%D6%C2%F0/blog/item/96ce5a83a7bb9db56c81199b.html

js 解决中文乱码函数-js中escape,encodeURI,encodeURIComponent三个函数的区别
http://blog.csdn.net/renhui15688/archive/2009/01/05/3710569.aspx

小楼宝宝的涂鸦花花(Imitater)的博客起名称骨测字皖ICP备06000023号-17