tomcat+JSP乱码解决
环境:tomcat5.5,
1. tomcat编码转换原则
所有页面、数据库、存取文件都应采用统一的编码,否则在处理过程中需要进行编码转换。在此统一编码假定为UTF-8,其它编码类似。
图表 1tomcat编码转换
默认情况下tomcat是按ISO-8859-1编码来处理数据的,所有传给tomcat的数据都会被转换为ISO-8859-1编码,而从tomcat中得到的也是以ISO-8859-1编码的数据。因此,在JSP代码从服务器获取客户端传递来的参数时,必须将参数编码从ISO-8859-1转为UTF-8。
2. 具体处理方式
各种编码名称:
http://www.iana.org/assignments/character-sets/character-sets.xml
2.1. 通用方法
String s = request.getParameter(“...”); String str= new String(s.getBytes("ISO-8859-1"),"UTF-8");
该方法过于繁琐,需要对每次得到的参数进行单独的转码。
2.2. 处理POST提交的数据
2.2.1. 方法一:
必须在第一次获取参数之前调用request.setCharacterEncoding(“UTF-8”);
注意:这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为"ISO-8859-1",并且使setCharacterEncoding的调用失效。
2.2.2. 方法二:
如果使用了spring框架,则可以在server.xml中使用
org.springframework.web.filter.CharacterEncodingFilter过滤器:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF8</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>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
注意:个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放.
2.3. 处理GET提交的参数
2.3.1. 修改URI编码
在这个目录下:Apache Software Foundation\Tomcat 6.0\conf的server.xml文件中,找到
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
然后修改如下: <Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
<!-- A "Connector" using the shared thread pool-->
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
注:对于tomcat5.0只需要修改第一个Connector就可以了。
有个地方说是在Connector中添上useBodyEncodingForURI="true",但我试了一下,不行。
3. 编码设置
3.1. *.jsp文件
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
contentType="text/html; charset=UTF-8":用于指定浏览器以UTF-8编码来解释网页。
pageEncoding="UTF-8" :说明该jsp文件的编码类型,必须与文件编码类型一致(在eclipse中会据此将文件保存为该类型,而不管eclipse当时的encoding是什么)。此外,tomcat会据此读取jsp文件并转化为servlet存为系统默认编码。
3.2. mysql数据库
1、mysql配置文件:修改mysql在windows\my.ini里default-character-set=utf-8
2、mysql里数据库和表也都设为utf8_unicode_ci
3、数据库连结:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
参考
http://www.blogjava.net/caizh2009/articles/309193.html
http://xinbupo.blog.163.com/blog/static/157566605201241684656283/