1.提交表单时的编码问题
页面Get或者Post提交form表单数据时,会对表单中的中文进行编码,而编码方式是由服务器页面响
应 Header中的“Content-Type: text/html; charset=gb2312”确定的(和浏览器解码方式一致)。
不管get提交还是post提交,input控件全部都进行了GB2312编码,提交的数据为“name=%B1%B1%BE
%A9&btnSumbit=sumbmit”。修改web.config中“responseEncoding=utf-8”,发现服务器页面响应
Header中的“Content-Type: text/html; charset=utf8”,再次提交表单时编码已经成了utf-8,
内容变为“name=%E5%8C%97%E4%BA%AC&btnSumbit=sumbmit”。
观察发现,不管get提交还是post提交,HTTP请求中并没有指定服务器端的解码方式,服务器端解
码还是根据服务器配置获取的
2.浏览器地址栏编码
在浏览器中输入地址:
编码方式随浏览器不同而不同,IE11编码方式为GBK,服务器用GB2312解码正确;Firefox34.0编
码方式为utf-8,服务器GB2312解码乱码。URL中的编码依赖于浏览器,开发中不建议使用,一些
地址链接含有中文时,建议在生成链接时,对中文指定编码方式编码。
3. JQuery中的AJax提交
JQuery是一款优秀的js框架,被广泛使用,但通过AJax提交数据时,却容易出现乱码。通过测试和
分析JQuery源码,AJax请求时,推荐方式为:
1)POST请求:参数放到data中,无需对参数值编码,JQuery在构造HTTP请求时,会调用js的函数
encodeURIComponent()对data中的键值对分别进行utf-8编码,服务器用utf-8解码。url中对应的
就是url地址,不能含有参数。
即使服务器Globalization结点配置的GB2312解码,Request.Form["xxx"]也会用utf-8解码,因为
AJax的post请求中在HTTP头添加了代码“Content-Type: text/html; charset=utf8”,告诉服务器
用utf-8解码,达到编码和解码一致的目的。这点可能和我们平时想的不一样,整站配置为GB2312
编码的站点,竟然AJax的post请求都是用的utf-8编码!
2)GET请求:参数放在Url中,并按照和服务器一致的编码方式编码,如服务器配置的Globalization
结点为UTF-8,则将参数值UTF-8编码,可以调用函数encodeURIComponent();如果服务器
配置为GB2312,则将参数用GB2312编码,可以调用escape()。Get和Post请求的一大差别
是,GET请求不会改变请求的Header,Request.QueyString["xxx"]解码用的是Globaliza
tion指定的编码。
默认情况下,JQuery的AJax方法通过post提交数据,编码都是用的utf-8,通过Header
指定服务器解码方式也为utf-8,但某些特殊情况下可能想服务器用gb2312解码(现在想
来应该不需要这种场景,因为本身就不大合理,当时可能在某些不大合理的前提下确实
需要来着,还不停的百度),网上查找资料是说AJax时,添加属性“contentType: "app
lication/x-www-form-urlencoded; charset=utf-8",”个人测试IE下生效了,服务器变
成了GB2312解码,但火狐下未生效,原因未知,单步跟踪了代码都执行了,没啥问题。