`
yangyiqian
  • 浏览: 117272 次
  • 来自: ...
社区版块
存档分类
最新评论

转载:教你彻底解决 Tomcat 5下文字乱码问题

    博客分类:
  • JAVA
阅读更多
http://tech.ccidnet.com/art/3539/20071205/1298139_1.html

使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码。
下面是本人解决之路。
一、初级解决方法

通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行解码转换,然后再按照 gb2312 进行编码,最后得到正确的内容。示例代码如下:

String  para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312");


具体的原因是因为美国人在写 tomcat 时默认使用 iso8859-1 进行编码造成的。

然而,在我们的 servlet 和 jsp 页面中有大量的参数需要进行传递,这样转换的话会带来大量的转换代码,非常不便。

二、入门级解决方法

后来,大家开始写一个过滤器,在取得客户端传过来的参数之前,通过过滤器首先将取得的参数编码设定为 gb2312 ,然后就可以直接使用 getParameter 取得正确的参数了。这个过滤器在 tomcat 的示例代码
jsp-examples 中有详细的使用示例,   其中过滤器在 web.xml 中的设定如下,示例中使用的是日文的编码,我们只要修改为 gb2312 即可
    < filter>
        < filter-name>Set Character Encoding< /filter-name>
        < filter-class>filters.SetCharacterEncodingFilter< /filter-class>
        < init-param>
            < param-name>encoding< /param-name>
             param-value>EUC_JP< /param-value>
        < /init-param>
    < /filter>


过滤器的代码如下:
public class SetCharacterEncodingFilter implements Filter {

    // 编码的字符串
    protected String encoding = null;

   // 过滤器的配置
    protected FilterConfig filterConfig = null;

   // 是否忽略客户端的编码
    protected boolean ignore = true;

   // 销毁过滤器
    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }

   // 过滤方法
    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);

    }


    // 初始化过滤器
    public void init(FilterConfig filterConfig) throws ServletException {

        this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;

    }

    // 返回过滤器设定的编码
    protected String selectEncoding(ServletRequest request) {

        return (this.encoding);

    }
}


然而在 tomcat5 中,即使使用过滤器,仍然可能取得乱码,原因何在呢?

三、高级解决方法

这是因为,在 tomcat4 和 tomcat5 中对参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的

在 tomcat 5 中,为了解决编码问题,tomcat 的作者作了很多努力,具体表现为在 tomcat 的配置文件 server.xml 中对 Connector 元素增加了如下的配置参数,专门用来对编码进行直接的配置

URIEncoding   用来设定通过 URI 传递的内容使用的编码,tomcat 将使用这里指定的编码对客户端传送的内容进行编码。

什么是 URI 呢?
java doc 的说明中如下说明:URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。

也就是说,我们通过 get 方法提交的参数实际上都是通过 uri 提交的,都由这个参数管理,如果没有设定这个参数,则 tomcat 将使用默认的 iso8859-1 对客户端的内容进行编码。

useBodyEncodingForURI 使用与 Body 一样的编码来处理 URI, 这个设定是为了与 tomcat4保持兼容,原来在 tomcat4 和 tomcat5 中队参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的,对 get 的处理通过 前面的 URIEncoding 进行处理,对 post 的内容依然通过 request.setCharacterEncoding 处理,为了保持兼容,就有了这个设定。

将 useBodyEncodingForURI 设定为真后,就可以通过 request.setCharacterEncoding 直接解决 get 和 post 中的乱码问题。

这样,我们可以通过在 server.xml 中设定 URIEncoding 来解决 get 方法中的参数问题,使用过滤器来解决 post 方法中的问题。

或者也可以通过在 server.xml 中设定 useBodyEncodingForURI 为 true ,配合过滤器来解决编码的问题。

在这里,我强烈建议在网站的创作过程中,全程使用 utf-8 编码来彻底解决乱码问题。

具体操作如下:
1、页面内容使用 utf-8 格式保存,在页面中加入
< mete http-equiv="contentType" content="text/html;charst=utf-8">


2、服务器端的 server.xml 中设定
useBodyEncodingForURI = true


3、使用过滤器,过滤器设定编码为 utf-8
分享到:
评论

相关推荐

    彻底解决 Tomcat 5 下文字乱码问题 - JSP日志 - ※一路风尘※

    在IT行业中,尤其是在Web开发领域,Tomcat是一个广泛使用的开源应用服务器,主要处理Java Servlet和JSP...通过这些步骤,开发者能够有效避免和解决Tomcat 5下的文字乱码问题,使得JSP日志和其他文本数据能够正常显示。

    解决tomcat中文乱码问题

    解决tomcat中文乱码问题,有详细的解释说明,希望对需要的人有所帮助

    解决tomcat下中文乱码问题

    解决 Tomcat 下中文乱码问题 在本文中,我们将讨论如何解决 Tomcat 下中文乱码问题。该问题是由于 Tomcat 默认的字符编码设置不正确引起的。我们将通过设置 Connector 元素的 URIEncoding 属性和在过滤器中设置字符...

    如何解决Tomcat下中文乱码问题?

    总结来说,解决Tomcat下的中文乱码问题,关键在于确保JSP页面的编码与服务器设置一致,并在处理表单提交时正确设置请求的字符编码。在实际开发中,推荐使用UTF-8作为统一的编码标准,因为UTF-8能够兼容各种语言,...

    Docker容器部署tomcat出现中文乱码.docx

    Docker 容器中 Tomcat 部署出现中文乱码解决方案 在 Docker 容器中部署 Tomcat 时,可能会遇到中文乱码的问题,这是由于 Docker 容器的 locale 设置导致的。在本文中,我们将介绍如何解决这个问题。 什么是 locale...

    解决Tomcat中文乱码

    ### 解决Tomcat中文乱码问题 在使用Tomcat服务器部署Web应用时,经常会遇到中文乱码的问题。本文将详细探讨这一现象的原因,并提供一种有效的解决方案。 #### 问题背景 在Tomcat环境下运行Web应用程序时,如果...

    Tomcat和weblogic中文乱码问题解决方案

    Tomcat和WebLogic中文乱码问题解决方案 在 Java Web 开发中,中文乱码问题一直是困扰开发者的主要问题之一。 Tomcat 和 WebLogic 是两个常用的 web 服务器,都是支持 Servlet 和 JSP 的。然而,在使用这些服务器时...

    tomcat显示出现中文乱码问题.docx

    本文将详细介绍如何解决Tomcat中的中文乱码问题。 首先,我们需要理解Tomcat的字符编码处理流程。Tomcat在接收HTTP请求时,会根据`Connector`元素的`useBodyEncodingForURI`属性和`URIEncoding`属性来确定请求参数...

    解决tomcat中文乱码问题.doc

    综上所述,通过合理设置JSP页面编码、配置请求过滤器以及进行必要的编码转换,可以有效解决Tomcat环境下中文乱码的问题。在实际应用中,还需要根据具体情况选择合适的解决方案,并注意保持前后端编码的一致性。

    Ubuntu下使用Tomcat搭建网站出现中文乱码的问题.docx

    要解决 Ubuntu 下使用 Tomcat 搭建网站出现中文乱码的问题,需要统一服务器的字符编码,包括 Linux 服务器、Tomcat 配置文件和 MySQL 数据库。通过统一字符编码,可以确保服务器的字符编码是一致的,避免乱码的出现...

    tomcat 下catalina.out 日志乱码问题处理

    标题中的“tomcat下catalina.out日志乱码问题处理”主要涉及的是在Tomcat服务器运行过程中,输出的日志文件`catalina.out`中,中文字符显示为乱码的状况。这通常是由于字符编码不匹配导致的,因为Tomcat在读取或写入...

    tomcat get提交中文乱码解决方案

    tomcat get提交中文乱码解决方案,修改tomcat server.xml 中以下为

    tomcat值乱码解决

    最近几个项目,都出现了乱码问题。某些通过URL来传送、值为汉字的参数,在页面中显示的是乱码,但是在本地开发环境是正常显示的。排除的因素当然就是服务器的设置不当了,但具体是那些原因呢?一般我们所装的linux...

    将cmd编码格式永久改为utf-8,解决部署以后tomcat乱码问题

    将cmd编码格式永久改为utf-8,解决部署以后tomcat乱码问题

    weblogic和tomcat 下载附件乱码问题

    本文将详细探讨WebLogic与Tomcat环境下解决下载附件乱码问题的方法。 #### 一、问题背景 在Web应用程序中,当用户点击下载链接后,浏览器会根据服务器返回的信息来判断如何处理这个下载请求。如果服务器返回的...

    解决Tomcat在控制台console中显示乱码的问题

    本篇将详细讲解如何解决Tomcat控制台中文乱码的问题。 首先,我们需要理解乱码产生的原因。通常,控制台乱码是由于字符编码不匹配导致的。Java默认使用的是UTF-8编码,而系统控制台可能使用的是其他编码,如GBK。当...

    tomcat与servlet乱码解决办法

    本文主要围绕Tomcat服务器下JSP页面以及Servlet中的乱码问题进行深入分析,并提供相应的解决方案。 #### 二、JSP页面乱码原因及解决方法 ##### 2.1 JSP页面乱码的原因 JSP页面中的乱码通常由以下几个因素引起: 1....

    关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论

    标题中的“关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论”涉及了两个关键的IT概念:Tomcat服务器的字符编码问题和Java虚拟机(JVM)内存管理的问题。让我们逐一深入探讨这两个主题。 首先,我们来...

Global site tag (gtag.js) - Google Analytics