您的位置:首页 > 编程语言 > Java开发

java 中文乱码终极解决方案(斩草除根式消灭中文乱码恶魔)

2008-03-22 21:14 417 查看
前段时间公司做feinar旅行网后台管理系统的开发,我和我的同事都是第一次真正参与这种大型的项目开发,在开发过程中,我们也曾几次遇到中文乱码的问题,很是困惑和苦恼,到网上去查,那些所谓的解决方案都不凑效,几经周折后,终于彻底解决了这个问题。通过查资料和多方面的综合考虑,最终得出了自己的的解决方案:

首先,确保你的数据库是支持中文的。把数据库的编码方式设置能支持中文的,如GB2132,utf-8等,而且经过测试后确实能写入中文且正常显示。这样就就保证了数据库确实是支持中文的,且可以正常输入和保存中文。如果数据库本身都不支持中文字符,那不管你怎么写代码都是无济于事的,肯定会出现中文乱码。

其次,从输入源杜绝中文乱码出现的可能。只有从数据输入源杜绝了中文乱码出现的可能,才能保证输入到数据库中的是正确的字符,加上我们第一步的保障,那么就保证了从数据库中读取的数据的正确性,从而也就保证了程序从数据库中读取的数据不会出现中文乱码成为可能。解决方法:

解决方法一:从页面输入杜绝乱码出现的可能
1、在jsp输入页面中加入:
<%@pagecontentType="text/html;charset=数据库字符集"% >
2、在html标签的<head>的第一行加入
<meta http-equiv="Content-Type" content="text/html; charset=数据库字符集" />

解决方法二:使用javax.servlet.Filter
1、编写web.xml配置。在
这样就可以保证页面发送的数据的编码与数据库编码一致,这样从数据库中读取的数据就是你想要的正确字符了,你可放心的读取了


<filter>


<filter-name>encoding</filter-name>


<filter-class>com.morecans.test.EncodingFilter</filter-class>


<init-param>


<param-name>charset</param-name>


<param-value>utf-8</param-value>


</init-param>


</filter>


<filter-mapping>


<filter-name>encoding</filter-name>


<url-pattern>/*</url-pattern>


</filter-mapping>

2、编写Filterservlet:com.morecans.test.EncodingFilter


package com.morecans.test;




import java.io.IOException;




import javax.servlet.Filter;


import javax.servlet.FilterChain;


import javax.servlet.FilterConfig;


import javax.servlet.ServletException;


import javax.servlet.ServletRequest;


import javax.servlet.ServletResponse;






public class EncodingFilter implements Filter ...{


private FilterConfig config;






public void destroy() ...{


System.out.println("*** destroy EncodingFilter");




}




public void doFilter(ServletRequest servletrequest,


ServletResponse servletresponse, FilterChain filterchain)




throws IOException, ServletException ...{


System.out.println("*** doFilter EncodingFilter");


String charset = this.config.getInitParameter("charset");


servletrequest.setCharacterEncoding(charset); //设


servletresponse.setCharacterEncoding(charset);


filterchain.doFilter(servletrequest, servletresponse);


}






public void init(FilterConfig filterconfig) throws ServletException ...{


this.config = filterconfig;


System.out.println("*** init EncodingFilter");




}




}



最后,在输出处避免乱码的出现。只有把输出控制好了,那么我们前面的工作就没有白费,前面的辛苦才会得到承认,才能得到收获。这一步,很简单,甚至都可以不要,因为我们前面的两步基本把这一步的工作也做了,我是说如果编码规范的话。然而,千里之堤,溃于蚁穴!行百里者半九十!希望前面的准备工作不会是徒劳,这是我们不原意看到的,所以在治理我还是建议不要因为这么一小步而错过了收获的季节。解决方法:

现在,你只需要在读取数据之前加上
request.setCharacterEncoding(数据库字符集);
response.setCharacterEncoding(数据库字符集);
而在jsp数据显示页面也像输出页面那样加上
<%@pagecontentType="text/html;charset=数据库字符集"% >
<meta http-equiv="Content-Type" content="text/html; charset=数据库字符集" />
整个过程,从源头到源尾,彻底的监视着数据的一举一动,时刻修正着数据的模样和流向,从而彻底消灭中文乱码这个恶魔的出现。

摘录来源:http://blog.csdn.net/morecans/archive/2007/07/15/1691860.aspx —— Morecans的专栏
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: