问题描述:
使用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();
记录一些网址: