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解码,但火狐下未生效,原因未知,单步跟踪了代码都执行了,没啥问题。
转载于:https://blog.51cto.com/11392920/1757948