一般来说,中小型的Java EE程序,都是会把Mysql作为首要的数据库选择,很大一个原因是Mysql开源、免费。要解决Mysql数据库中文乱码,就要统一Java EE程序和Mysql数据的编码字符。一般来说,中文的编码字符会选择GBK或者UTF8,UTF8占用的存储空间会比较大,但是UTF8能支持各国的文字编码(可以说是万国码)。下面我选用UTF8编码。
将Java EE程序的编码统一设为UTF8
这里将使用Filter来将请求和响应的编码设置为UTF8,一个CharacterEncodingFilter,一般来说,如果你的web.xml配置文件有若干个Filter要配置,那么优选字符集编码设置的Filter放在前面。
public class CharacterEncodingFilter implements Filter {
private String characterSet = "UTF-8"; //默认的字符编码集是UTF-8
public String getCharacterSet() {
return characterSet;
}
public void setCharacterSet(String characterSet) {
this.characterSet = characterSet;
}
/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) arg0;
request.setCharacterEncoding(characterSet);
HttpServletResponse response = (HttpServletResponse) arg1;
response.setCharacterEncoding(characterSet);
arg2.doFilter(request, response);
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
String characterSet = arg0.getInitParameter("characterSet");
try{
Charset.forName(characterSet);//如果是一个不存在的字符集,将抛出异常
this.characterSet = characterSet;
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
web.xml文件配置
<!-- 字符编码Filter -->
<!-- BEGIN -->
<filter>
<description>统一字符编码的Filter</description>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.daniel.filter.impl.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>characterSet</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- END -->
这里还需要注意,在JSP或者HTML页面上,通过表单传递的参数,必须是指定使用method="post",否则在页面之间传递中文,也是会乱码的。
统一Mysql编码
有时候,你即使设置了表的字符编码是UTF8,但是,你通过Java EE传递过去的中文存储到数据库中仍然是错误的!很多人都会费解,其实不然,这个表的字符编码式没有错,错就错在了你传递过来的中文第一时间是经过一个mysqld的守护线程来处理的,默认情况下,这个守护线程的字符编码集是latin1(一个西欧字符编码集),中文被当做西欧来进行处理,再存到数据库,当然是错误的。要解决上述问题,需要配置my.ini这个Mysql启动时的配置文件。
[client]
port=3306
[mysql]
default-character-set=utf8
这里client,主要是通过控制台这些传递中文,把它默认的字符编码集设置为UTF8,继续往下找,设置mysqld
[mysqld]
default-character-set=utf8
把守护线程的默认编码集,也更改成为UTF8
总结
通过同一个Java EE程序和Mysql的编码集,那么就不会出现中文乱码的情况。