常规解决乱码问题的方法是:java
a.把全部的jsp页面的charset设置为UTF-8。
b.添加过滤器,在filter内调用request.setCharacterEncoding("utf-8")方法将request的字符集设定为utf-8。
<filter>
<filter-name>CharacterEncoding</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>CharacterEncoding</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
c.Tomcat(或jboss)的URIEncoding默认是ISO-8859-1,须要设置为UTF-8。
tomcat目录下......\conf\server.xml文件中
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
加上 URIEncoding="UTF-8"
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
以上方法全用上基本上能够解决一些广泛问题
在实际的应用当中,主要会有如下四种使用方法:
一、表单的get提交
二、表单的post提交
三、页面连接传递中文参数
四、地址栏中参数直接输入中文提交(直接在ie或firefox中敲上中文进行访问)
在分析解决以上的几种状况前,首先咱们先了解一下,一个url请求并响应的流程
浏览器 IE/FireFox ----------->Servlet容器------------------------>显示页面
编码 使用容器的URIEncoding转码 根据页面的编码设置进行解码
1.表单get方式提交
浏览器根据页面的charset编码方式对页面进行编码,而后提交至服务器。首先,进入对应的字符编码过滤器(若是有的话),不过,Tomcat6.0,对于 get提交方式采用的是server.xml文件中的URIEncoding编码方式,而并不会采用过滤器中设置的编码,那么,根据个人环境设置,jsp页面都使用UTF-8的编码,Servlet容器的URIEncoding也设置为UTF-8,则servlet不用进行转码便可正确解码,得到正常的中文 字符串。那么,响应页面的中文由于页面的统一编码(UTF-8)天然也会正常显示。固然,若是咱们的Tomcat的URIEncoding设置为其余,非UTF-8的编码方式时,页面的内容进入Tomcat解析时,由于Tomcat和页面的编码不统一,就须要转码。
例如,若是咱们采用Tomcat默认的 ISO-8859-1,那么当咱们使用request.getParameter("param1")获取表单参数值时,其实Servlet就进行了转码,转码过程为UTF-8-->ISO-58859-1(个人页面charset都是UTF-8),java伪代码以下:
new String(param1.getBytes("UTF-8"), "ISO-8859-1"); web
new String(变量值.getBytes("UTF-8"),"ISO-8859-1");
例如表单的username属性以字符串"编辑"提交,那么进入容器后,FormBean中的这个变量会乱码,request.getParameter(username)同样的效果,s1就是request返回的结果,下面是内存快照。spring
不过,即便是这样,咱们依然可使用很是规的方法,取出并显示出正常的中文,即逆向转码,例如上面的乱码,咱们能够经过ISO8859-1-->UTF-8转换一次,还原出正确的中文。
综上所述,将Tomcat的URIEncoding设置为UTF-8(即和页面的编码一致便可)就能解决这类状况,get时,页面会先按页面设置的编码编码,再提交至web server,显示时会再根据显示页面的编码进行解码。浏览器
2.表单的post提交
对于这种方式的请求,request.setCharacterEncoding(通常来自于web.xml中过滤器设置的参数)方法进行编码,设置将会产生做用,struts的表单提交方式默认为post方式,所以,若是都采用UTF-8编码方式,就不会产生中文乱码问题。tomcat
3.页面连接中传递中文参数
我虚拟一个这样的场景,请求页面中有以下代码服务器
Html代码 app
<%
String username = "编辑";
%>
<a href="hello.do?username=<%=username%>">页面中连接传递中文</a>
对于这种方式,咱们须要先将参数使用统一的编码方式编码,将编码后的字符放入连接,这里我对参数以UTF-8方式编码,以下jsp
Java代码 post
<%
String username = java.net.URLEncoder.encode("编辑","UTF-8");
%>
那么,这样咱们也不会产生中文乱码问题,由于,字符串编码的处理过程:字符串->UTF-8(提交的页面charset)->UTF-8(web server URIE)->UTF-8(显示的页面)。
4.地址栏中参数直接输入中文提交测试
考虑如下场景,在浏览器地址栏中直接输入"http://localhost:8080/helloapp.do?username=编辑"提交,对于这种方式,浏览器不会采用页面的charset方式,也不会按照filter设置的编码方式。URL中的中文进行编码后,提交至服务器(IE,FireFox都同样),而是采用系统的GBK(估计可能和browser的语言版本或设置相关,个人机器上是编码到GBK)转码为ISO- 8859-1以后,提交至Servlet容器,那么,若是对于前三种方式咱们所作的设置,此种场景下就不正常了。由于,进入容器时中文进行了GBK至ISO- 8859-1的转码,而以前咱们的Servlet容器URIEncoding设置为UTF-8,当咱们使用 request.getParameter("username")时,至关于又进行了这样的流程GBK-->ISO- 8859-1-->UTF-8,按照以上咱们使用的测试,那么就会是乱码了。此时,若是是使用GBK-->ISO- 8859-1-->GBK的方式转换,那么就能正常取出中文汉字。
对于这种状况,咱们能够采用的解决办法就是,Tomcat的URIEncoding采用默认的ISO-8859-1字符集,那么咱们能够在程序中经过ISO-8859-1-->GBK这样的转码方式获得正常的中文“编辑”,但这样的结果是,咱们get请求方式的中文处理解决办法,就有问题了。
综上分析所述,对于乱码问题,前三种方式是通常用户的请求方式,第四种属于非正常途径的请求方式,对于这种方式产生的问题,可能没法很好的解决(和浏览器有关server端没法控制)。测试IE6的设置会影响应用路径的编码方式,例如地址栏中请求一个中文JSP页面,如:http://localhost:8080/helloapp/编辑.jsp,IE默认是勾选"以UTF-8发送 URL"项的,那么按照我上面总结的处理方式,这个请求能够正常显示页面,如图:
若是取消IE的这个选项,那么浏览器会以GBK编码应用路径的中文,获得的结果如图:
按照我上面的设置,若是将Tomcat的URIEncoding设置为GBK,则也能够正常显示页面。对于FireFox3.0,则是以UTF-8编码。所以,第四种场景是和客户端相关。所以,在项目中尽可能避免第4种场景的状况出现,就基本能够解决java web开发中的乱码问题了。