“”先让我们想一想,仔细分析一下环节。
从jsp前台 -> 后台java代码 -> 再到DB。再从DB -> 读出到后台 -> 显示到jsp上。
看是哪个环节出问题。通常我们是建议使用utf-8,那么每一个环节都要保证是utf-8。
这里有两个过程,一是写的过程,二是读出来显示的过程。
先判断是哪个过程出的问题,很简单,先手动在DB插入一条中文的记录,看前台能否显示,能表示读的过程没问题,乱码出在写的过程中。
我们再看写的过程。
这里每一个环节会涉及到每一个修改点。
jsp 提交到后台。或者说到服务器。 这里在于服务器tomcat的设置,要修改tomcat的设置。
二、从后台java代码存到db中去。这里在于db的字符集设置,要修改的是db.
所以,如果你要判断是哪个环节的问题,只要在后台的java代码打个断点,然后看一下提交过来的数据是否乱码,如果这时候已经有乱码了,说明tomcat的设置有问题。
如果提交过来的中文能显示,而存到DB后的数据是乱码,说明是DB的字符集有问题。
先说 tomcat服务器的设置,然后再说DB的字符集设置。
首先,你要知道tomcat设置的编码是什么,如果我们不做任何设置,tomcat的默认的字符集是ISO-8859-1,不管是请求request,还是响应response。
然后,对于GET请求和POST请求它们也有所不同。
GET请求是通过URL进行传参编码,而POST请求则是通过HTTP请求体的BODY来的。
如何修改让tomcat的get请求按utf-8进行编码?
修改 sever.xml. 在 节点增加属性:
1. URIEncoding=”UTF-8” 2. useBodyEncodingForURI=”true”
如何让post请求的数据可以按utf-8进行编码。
添加过滤器filter。
1. 如果你是使用tomcat6.0.36+ 或者 tomcat7,tomcat已经定义了这个过滤器,你自己将它加到web.xml就可以了。
org.apache.catalina.filters.SetCharacterEncodingFilter
webapps/examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.java
org.springframework.web.filter.CharacterEncodingFilter
以spring的为例,贴上完整的过滤器的代码:
<filter>
<filter-name>charsetFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>charsetFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
参考:http://wiki.apache.org/tomcat/FAQ/CharacterEncoding
mysql的设置就比较简单了,你要保证所有的编码都设置成utf-8就万事大吉了。
执行一下:
SHOW VARIABLES LIKE 'character_set_%';
列出来的,如果有不是utf-8的其他编码,修改就是了。
从大到小有,mysql本身的默认编码,新建的数据库DB的默认编码,表和字段的编码。好多。
如何修改:
1: 在Mysql的配置文件 my.ini (一般在c:/windows/下面) 里加上服务器的默认编码配置: default-character-set=utf8
2: 修改你的数据库的字符编码:进入Mysql数据库,通过命令修改你的数据库字符编码: ALTER DATABASE databaseName
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci (修改后需要重启Mysql数据库)
3: 如果你的表以及表里的字段使用了不正确的字符编码,同样需要修正过来:命令:
修改表的编码: ALTER TABLE tableName
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
修改字段的编码: ALTER TABLE tableName
CHANGE dd
dd
VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
(做好了时,再跑一下上面那两个查看字符编码的命令,看看是否全部都变成了utf8)
4: 如果还无效的话,再尝试使用这个MYSQL数据库连接字符串: jdbc:mysql://localhost:3306/xxxx?useUnicode=true&characterEncoding=UTF-8 (有时可能需要将符号(&)转码写成(&))
参考:http://www.busfly.net/post/mysql-utf8.html
最后,再总结一下。
1. URIEncoding="UTF-8" useBodyEncodingForURI="true" is set in server.xml (Tomcat)
2. <filter>
<filter-name>charsetFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEnco dingFilterfilter-class>
param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
param>
filter>
in web.xml
3. CHARACTER SET for tables in MySQL is set to UTF-8.
4. <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> in all jsp pages.
5. "text/html; charset=UTF-8"> in all jsp pages.
参考:http://forum.springsource.org/showthread.php?33594-Tomcat-UTF-8-encoding-problem