彻底解决Tomcat 5 下文字乱码问题

原创 2007年09月21日 16:14:00
 
使用 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中文乱码问题的原理和解决方法(全面、详细)

自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。  一、Java中文问题的由来  Java的内核和class文件...
  • lynxzong
  • lynxzong
  • 2013年10月11日 13:23
  • 8773

tomcat下jsp乱码原因(下)

tomcat下jsp乱码原因(下) ,解决乱码的几种方式方法
  • jgwei
  • jgwei
  • 2014年11月11日 16:11
  • 1879

Tomcat解决中文乱码的几种方式

一、对Tomcat_HOME/conf/server.xml文件进行配置(本机的完整目录为D:/Users/Administrator/Tomcat/apache-tomcat-7.0.54/conf...
  • lengjinghk
  • lengjinghk
  • 2016年07月18日 06:41
  • 36912

tomcat在linux下出现乱码问题

我用的Tomcat,现在遇到乱码问题:  通用的解决方案如下:  Java代码   "8080" connectionTimeout="20000" redirectPort...
  • mingming_vip
  • mingming_vip
  • 2014年10月27日 14:26
  • 1694

基于Tomcat的JSP提交表单时乱码

参考文献:Servlet容器Filter的使用(Filter解决乱码问题实例)、Java Servlet Filter、提交表单时的中文乱码问题、jsp乱码问题的解决 原因: Tomcat下面总是会把...
  • qq476764704
  • qq476764704
  • 2014年12月18日 14:19
  • 527

Tomcat部署jsp,出现乱码问题

一、Java中文问题的由来  Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本...
  • shanzhizi
  • shanzhizi
  • 2014年08月12日 22:32
  • 5739

VIM中文乱码原理详解及终极解决方案[经典]

此文讲解的是vim编辑多字节编码文档(中文)所要了解的一些基础知识,注意其没有涉及gvim,纯指字符终端下的vim。 vim编码方面的基础知识: 1. 存在3个变量: encoding—-该选项...
  • mjj291268154
  • mjj291268154
  • 2016年07月20日 15:15
  • 910

JavaWeb之不同Tomcat版本对get、post请求,中文乱码问题

Myeclipse安装时的前期工作空间的编码准备,就不说了 Tomcat8 Tomcat8 public class dd extends HttpServlet { private stati...
  • u013497151
  • u013497151
  • 2015年05月15日 19:52
  • 1987

数据库中文乱码解决方案总结,tomcat+mysql+hibernate

数据库中文乱码解决方案汇总
  • chenjiazhu
  • chenjiazhu
  • 2016年07月15日 10:35
  • 1644

Mac英文版MyEclipse 10运行tomcat日志乱码

Mac在使用之初选择了中文一直没问题,今天心血来潮修改了系统语言,然后启动MyEclipse的tomcat,在console中一直是乱码。     1. 刚开始以为是log4j的配置有问题,检查了下配...
  • junjunyanyan
  • junjunyanyan
  • 2014年12月04日 22:56
  • 1575
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:彻底解决Tomcat 5 下文字乱码问题
举报原因:
原因补充:

(最多只允许输入30个字)