参考:java
http://blog.csdn.net/error_case/article/details/8250209web
中文乱码是个老生常谈的问题,通常状况下,只要保证页面,web服务器,数据库的编码一致,不多出现中文乱码,不过最近项目中碰到了一个之前没在乎过的问题,就是post提交和get提交的中文乱码处理方式不同的问题,具体状况是这样的:为了方便,我将tomcat服务器的编码方式设置为utf-8,设置方法以下:ajax
在tomcat的server.xml的
<Connector port="8080" protocol="HTTP/1.1"?
connectionTimeout="20000"?
redirectPort="8443"/>
节点中,加上useBodyEncodingForURI="true"这个属性,这属性的默认值 是false,另外也能够在那个节点中加上URIEncoding="UTF-8"属性。spring
设置后,重启tomcat,发现get方式提交的数据没中文乱码,但post提交的数据依旧存在中文乱码,经过在网上搜索一看,这样的设置只能处理get请求方式的中文乱码,不能处理post请求方式的,缘由应该是get方式是将参数拼接在url中的,而post方式是将参数写在http协议的body中的;post还乱码,我在java代码中转码看了下,转码后正常,转码代码:数据库
String a = new String(request.getParameter("a").getBytes("ISO8859_1"),"UTF-8");json
从这能够看出来,tomcat服务器仍是以默认编码方式提交了请求,为了改变请求提交编码方式,就须要设置request.setCharacterEncoding("UTF-8");,设置后测试,没中文乱码了,不过若是在开发中每一个jsp页面这样写的话,也不太和谐,为了方便,能够制做一个filter,在处理请求前,对全部的request都设置它的编码为须要的编码方式,这样就不用在每次处理的时候来设置编码了。tomcat
-----------------------------------服务器
hl add 20140107 不少框架都提供了相似的filter ,好比spirngmvcmvc
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>app
---------------------
hl add 20140108 ajax, json经过post方式走filter没问题,可是若是经过get方式会出现乱码
解决方案:jsp页面拼装的时候经过encodeURI转码,java接收的时候也经过URLDecoder.decode转码
js:
var age = encodeURI($(“age”).attr(“value));
var userName = encodeURI($(“userName”).attr(“value));
var user = {userName: userName, age: age};
$.ajax({
type: “get”,
data: user
})
java:
String userName = URIDecoder.decode(user.userName);
-----------------------------------------------------------------------------------------
测试结果:
增长URIEncoding="UTF-8"属性不行,修改为URIEncoding="GBK"就能够了,不知何故。