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

前段时间公司做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=数据库字符集" />

整个过程,从源头到源尾,彻底的监视着数据的一举一动,时刻修正着数据的模样和流向,从而彻底消灭中文乱码这个恶魔的出现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值