1, mysql安装时设置字符集utf-8(包括数据库字符集,以及表的字符集), jdbc驱动用最新的
2. hibernate配置文件(hibernate.cfg.xml)中,加上属性
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
3. web.xml设置Filter
=================================================
< filter > < filter-name > Set Web Application Character Encoding </ filter-name > < filter-class >com.util. SetEncodeFilter </ filter-class > < init-param > < param-name > defaultencoding </ param-name > < param-value > UTF-8 </ param-value > </ init-param > </ filter > < filter-mapping > < filter-name > Set Web Application Character Encoding </ filter-name > < url-pattern > /* </ url-pattern > </ filter-mapping >
============================================= SetEncodeFilter.java
1 package com.util; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 12 public class SetEncodeFilter implements Filter { 13 14 protected FilterConfig filterConfig = null ; 15 16 protected String defaultEncoding = null ; 17 18 /** */ /** //* (non-Javadoc) 19 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 20 */ 21 public void init(FilterConfig arg0) throws ServletException { 22 // TODO Auto-generated method stub 23 this .filterConfig = arg0; 24 this .defaultEncoding = filterConfig.getInitParameter( " defaultencoding " ); 25 } 26 27 /** */ /** //* (non-Javadoc) 28 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 29 */ 30 public void doFilter( 31 ServletRequest request, 32 ServletResponse response, 33 FilterChain chain) 34 throws IOException, ServletException { 35 // TODO Auto-generated method stub 36 request.setCharacterEncoding(selectEncoding(request)); 37 chain.doFilter(request, response); 38 } 39 40 41 public void destroy() { 42 43 this .defaultEncoding = null ; 44 this .filterConfig = null ; 45 } 46 47 48 protected String selectEncoding(ServletRequest request) { 49 50 return this .defaultEncoding; 51 } 52 53 }
4.提交表单的jsp页面设置 <%@ page language="java" contentType="text/html; charset=UTF-8"%>
至此问题已经解决 , 但是还有一些我们应该了解的 , 下面我简述一下 :
为每个jsp 页面设置了其编码格式(utf-8) ,但传递数据到另一页面时依然显示为乱 码? 首先要需要了解的是web 容器默认编码是iso-8859-1 ,一个汉字占用两个字节,而在utf-8 中一个汉字占用三个字节。所以在数据传递过 程中,必须手动设定容器编码格式,否则会出现字符位丢失的情况。即3 个字节变为两个字节,自然会变成乱码。为什么保存到数据库中的数据都变成了乱码? 原理同上,首先要搞清楚使用的数据库默认的编码格式,比如mysql 默认的字符编码是ISO-8859-1 。所以必须手动修改其默认编码格式。 清楚了 以上问题后,再来看如何解决utf-8 的乱码问题。
1.设置web 容器的编码格式。为你的servlet 的doGet 或doPost 方法开始处加入如下代 码:request.setCharacterEncoding("utf-8"); response.setCharacterEncoding ("utf-8");
2.为每个jsp 页面指定其编码格式。<%@ page pageEncoding="utf-8"%>
3.在连接数据库用的URL 后加入:useUnicode=true; characterEncoding=utf-8 如: url="jdbc:mysql:///db1?useUnicode=true; characterEncoding=utf-8"
4.为指定数据库默认编码格式。在C:/WINDOWS 目录下找到my.ini 文件,并在 [mysqld] 中加入default-character-set=gbk ,重新启动mysql 服务。
至此,乱码问题全部解决。
起初总搞上去不清, 为什么要将mysql 的默认编码格式设置为gbk ,后来由相关的资料得知utf-8 默认输入编码方式为gbk ,默认输出编码方式为utf-16be 。
个人认为,将数据进行utf-8 进行编码的目的( 即将中文编码为%的形式) ,主要是为了在多层服务间进行数据传输时,防止发生字符丢失( 如msn) 。普 通的web 程序显然没有必要这样做,只要使用以上方法进行处理,就可以有效的解决乱码问题,从而结省存储空间。如果都像公司的SC 系统那样,将一个汉字编 码为18 个字符后,再存储到数据库中,抛开效率不说,就存储空间的浪费就够人受的,要知道,那是需要银子地!