`
walsh
  • 浏览: 433102 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Java WEB开发中的中文乱码问题解决之终极之道

阅读更多
[size=medium]每一个JAVA WEB开发者都会碰到乱码问题。本文阐述了JAVA WEB开发中乱码的完全解决方法。
JAVA中,一个WEB应用从构成部分来看无非分3部分:
1)    JSP
2)    JAVA程序(业务逻辑)
3)    数据库
要解决乱码问题,也从这3部分入手。

其实,我们的目标很明确,第一,保证显示中文时不为乱码;第二保证保存到数据库里的数据不为乱码。

怎么样实现上面2个目标呢?让我们从数据的输入/输出的角度来分析。一个典型的用户请求的过程为:
1) 浏览器接收用户输入
2) 用户输入的数据-〉JAVA程序
3) JAVA程序对数据进行处理,保存到数据库(需要保存时)
4) 从数据库取出数据,返回给浏览器
原则上,如果我们能保证在上述阶段中的数据编码都采用同一个编码方式的话,就应该不会产生乱码。怎么样把它们的编码方式统一起来呢?可以通过以下几个步骤实现:

1、用Filter把用户的输入数据统一编码后再传送给JAVA程序。
  1) Filter可以用Tomcat提供的SetCharacterEncodingFilter.class,也可以使用如下代码自己做一个SetCharacterEncodingFilter:
public class SetCharacterEncodingFilter   
    implements Filter   
{   
  
    protected String encoding;   
    protected FilterConfig filterConfig;   
    protected boolean ignore;   
       
    /**  
     * Constructor  
     *   
     */  
    public SetCharacterEncodingFilter()   
    {   
        encoding = null;   
        filterConfig = null;   
        ignore = true;   
    }   
  
    /**  
     * @see javax.servlet.Filter#destroy()  
     */  
    public void destroy()   
    {   
        encoding = null;   
        filterConfig = null;   
    }   
  
    /**  
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)  
     */  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)   
        throws IOException, ServletException   
    {   
        if(ignore || request.getCharacterEncoding() == null)   
        {   
            String encoding = selectEncoding(request);   
            if(encoding != null)   
                request.setCharacterEncoding(encoding);   
        }   
        chain.doFilter(request, response);   
    }   
  
    /**  
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)  
     */  
    public void init(FilterConfig filterConfig)   
        throws ServletException   
    {   
        this.filterConfig = filterConfig;   
        encoding = filterConfig.getInitParameter("encoding");   
        String value = filterConfig.getInitParameter("ignore");   
        if(value == null)   
            ignore = true;   
        else  
        if(value.equalsIgnoreCase("true"))   
            ignore = true;   
        else  
        if(value.equalsIgnoreCase("yes"))   
            ignore = true;   
        else  
            ignore = false;   
    }   
  
    /**  
     * @param request  
     * @return  
     */  
    protected String selectEncoding(ServletRequest request)   
    {   
        return encoding;   
    }   
}  


2) web.xml里设置:
<filter>   
    <filter-name>SetEncoding</filter-name>   
    <filter-class>包名.SetCharacterEncodingFilter</filter-class>   
    <init-param>   
        <param-name>encoding</param-name>   
        <param-value>UTF-8</param-value>   
    </init-param>   
 </filter>   
  
  
 <filter-mapping>   
    <filter-name>SetEncoding</filter-name>   
    <url-pattern>/*</url-pattern>   
 </filter-mapping> 


如果定义后编码还有问题,注意filter-mapping在web.xml中的定义顺序。
2、 数据库采用跟HTML一样的编码。
   数据库编码设置为utf-8
3、 JSP里明确指定编码方式,告诉编译器采用我们指定的编码对JSP加以编译。
JSP文件的开头加上:
<%@ page contentType="text/html; charset=UTF-8" %>   
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>  


4、使用HTML<meta />标签告诉浏览器使用指定的编码
<meta http-equiv="content-type" content="text/html; charset=UTF-8">  


5,    统一资源文件(比如消息等定义文件)的编码方式。并在打包之前用转换成ASCII码。用ant工具的情况下,可以执行以下方法加以转换:
<native2ascii encoding="utf-8" src="资源文件所在路径" dest="${classes.dir}"  includes="**/*.properties" />

以上范例假设统一使用utf-8编码。你可以根据你的实际情况使用适合你的编码。 [/size]
分享到:
评论

相关推荐

    Java Web开发(JSP、Servlet)乱码终极解决方案.txt

    在Java Web开发中,尤其是使用JSP和Servlet技术时,字符编码问题——即所谓的“乱码”问题,是开发者常遇到的挑战。本篇将详细解析如何在Java Web项目中彻底解决乱码问题,确保数据在各个环节都能正确地显示和处理。...

    j2ee中文乱码问题终极解决之道

    在Java/J2EE开发中,中文乱码问题是一个常见的困扰,尤其在数据传输、页面展示以及数据库交互过程中。本文将详细解析这个问题,并提供多种解决策略。 首先,我们要理解乱码产生的原因。Java语言内部使用UTF-8编码...

    Java/J2EE中文问题终极解决之道

    ### Java/J2EE中文问题终极解决之道 在Java/J2EE开发过程中,中文字符编码问题一直是困扰许多开发者尤其是初学者的一大难题。对于此类问题的根本解决方法不仅需要理解Java系统内部如何处理字符编码,还需要掌握一...

    Java-J2EE中文问题终极解决之道.doc

    ### Java-J2EE中文问题终极解决之道 #### 一、问题背景与挑战 在Java及J2EE领域中,中文支持一直是开发者面临的一大难题。尤其是对于那些初学者来说,中文字符的正确显示与处理往往成为项目的绊脚石。本文旨在探讨...

    java中文乱码终极处理方案.docx

    总之,解决Java中的中文乱码问题,需要深入理解各种编码格式,正确设置文件编码,以及在Web应用中统一处理请求的字符编码。通过以上方法,大多数乱码问题都可以迎刃而解。在实践中,还应注意在开发环境和生产环境中...

    乱码问题终极解决方案

    本篇文章将针对"乱码问题终极解决方案"这个主题,深入探讨在Java、JSP和Ajax中如何有效地预防和解决乱码问题。 首先,我们要理解乱码产生的原因。乱码通常是因为字符编码不一致导致的,比如文件编码、程序内部编码...

    J2EE中文问题终极解决之道

    ### J2EE中文乱码问题终极解决之道 在开发基于J2EE的应用系统时,中文乱码问题是开发者经常遇到的一个难题。本篇文章旨在提供一种全面、深入的解决方案,帮助开发者彻底解决这一问题。 #### 一、理解编码机制 在...

    Struts2乱码终极解决办法

    ### Struts2乱码终极解决办法 #### 一、引言 在开发基于Struts2框架的应用时,经常遇到的一个问题就是中文乱码。这不仅影响用户体验,还可能导致数据处理错误。本文将详细介绍如何彻底解决Struts2中的乱码问题,并...

    Tomcat乱码问题

    ### Tomcat乱码问题及其终极解决方案 在使用Tomcat服务器部署Web应用时,字符编码问题时常困扰着开发者,尤其是在处理中文或特殊字符时,页面显示出现乱码是常见的现象。本文将深入探讨Tomcat乱码问题的原因,并...

    JSP乱码终极攻略和AJAX初步运用

    在Java Web开发中,JSP乱码和AJAX的应用是两个常见的主题。本文将深入探讨这两个话题,提供解决方案,并给出详尽的实践指导。 首先,让我们来解决JSP项目的乱码问题。乱码通常是由于编码不一致导致的,尤其是在处理...

    struts中文问题,struts国际化问题——终极解决方案

    ### Struts中文问题与国际化问题——终极解决方案深度解析 #### 引言 在Web应用开发中,特别是使用Struts框架时,中文显示和国际化(Internationalization,简称i18n)问题是开发者常遇的挑战。本文将深入探讨解决...

    SmartUpload+用于JDK1.5(中文终极解决版)

    SmartUpload 是一个强大的Java文件上传组件,专为处理Web应用程序中的文件上传问题而设计。它在JDK 1.5环境下运行良好,提供了对中文字符集的全面支持,解决了中文文件名上传后出现乱码以及中文参数处理的问题,同时...

    软件开发常用的查询文档

    `chm乱码终极解决方案.txt` 提供了解决CHM文件乱码问题的方法,这对于处理不同编码格式的CHM文档时可能会遇到的问题非常有帮助。 最后,`W3school离线测试版5.0版-20110318` 是W3School的离线版本,W3School是一个...

    Java IDE编辑器 IntelliJ IDEA 使用基础篇

    IntelliJ IDEA是一款由JetBrains开发的跨平台IDE,它支持多种编程语言,尤其是Java开发领域中的佼佼者。该IDE提供了丰富的功能,包括代码编辑、调试、单元测试、版本控制等,同时还具有智能代码补全、重构支持等功能...

    SmartUpload+上传组件(中文终极解决版)+JDK1.6

    这个组件在中文环境下提供了全面的支持,解决了许多中文字符编码问题,因此被称为“中文终极解决版”。结合JDK 1.6,它能很好地在早期的Java环境中运行,提供稳定且高效的文件上传功能。 1. **SmartUpload组件基础*...

    struts从入门到精通.doc

    - 探讨了如何解决Struts框架中的中文乱码问题和国际化需求。 - **3.5 为Web服务构建Struts应用程序** - 讲述了如何利用Struts框架来构建Web服务应用。 - **3.6 Struts标记库是如何工作的** - 解释了Struts标记库...

Global site tag (gtag.js) - Google Analytics