在项目中偶尔会遇到jsp传到后台出现中文乱码而不知所措.下面将讲解出现中文乱码的几种状况.html
pageEncoding:表示页面编码,是设置JSP页面源代码的字符编码格式,若是该项的值是utf-8,则JSP源代码里不能写汉字了,若是你用的是eclipse等工具的话,保存时他会提示有一个错误,改为gbk就没事了。java
charset:表示字符编码,是请求服务器之后返回过来的内容的字符编码,即便pageEncoding设置了gbk,保存,运行程序,查看页面时会发现刚才写的汉字不能正常显示,把charset改为gbk,就行了mysql
注意:在设置JSP页面源代码字符编码的时候,若是有pageEncoding这一项,则采起这一项的值,若是没有,采起charset的值,若是都没有,采起iso8859-1。pageEncoding 和charset的预设都是 ISO8859-1. 而随便设定了其中一个, 另外一个就跟着同样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSP容器的处理方式。如:在Tomcat中若是在jsp中设定了pageEncoding,则contentType也跟着设定成相同的编码了,可是在resion中就不是,resin中还会用默认的,这点经过查看编译后的类servlet java文件就能够看到这一点,而问题偏偏就出在这里,因此,在jsp中,若是是在resin下最好仍是明确的单独设定这2个属性。web
JSP要通过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat返回来的网页,用的是charset。 ajax
第一阶段:将jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),若是pageEncoding设定错了,或没有设定,出来的就是中文乱码,或者没法编译。spring
第二阶段:由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,通过这个阶段的结果所有是UTF-8的encoding的java源码。 sql
第三阶段:Tomcat(或其的application container)载入和执行阶段,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数charset就发挥了功效。数据库
总结:一般咱们在JSP页面设定<%@ page contentType="text/html;charset=GB2312"%>便可。apache
在web.xml中配置编码过滤器时应注意的过滤器的顺序,通常将代码放在web.xml中开头的位置,由于拦截有顺序,若是放在后面的话容易拦截不到。浏览器
<!-- zh-cn encoding -->
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--中文乱码解决方案-->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
例如:
url="jdbc:mysql://localhost:3306/Laptop?useUnicode=true&characterEncoding=utf-8"
默认状况下,若是tomcat中部署的webservice或者web网站须要有中文的请求参数,而这时候咱们直接在浏览器中输入中文那么接受到的将是乱码,没法达到咱们的需求,这时候咱们就须要对Tomcat的请求连接的编码格式进行设置了。
在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"/>
注意:有人说URIEncoding="UTF-8"必须加在最后面,不然无效,我测试时没有发现该问题,但为以防万一仍是它加在后面吧;另外修改完Server.xml文件后必须重启服务。这种配置只对GET类型的请求有效,对POST请求无效。即POST请求的参数编码仍然是“ISO8859-1”,而不是“UTF-8”
当出现以下场景时可以使用该方法:表单填写完信息后提交,将提交信息在控制台中打印出来,若是表单的使用GET提交出现乱码,而使用POST提交后控制台打印显示正常,则能够尝试使用“修改Tomcat中conf路径下的Server.xml文件”。