彻底解决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
 
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Spring MVC 自带的字符编码过滤器以及Tomcat字符编码设置,彻底解决中文参数乱码问题

java Web项目添加Spring支持后,可使用Spring自带的字符编码过滤器。源码在spring-web-4.1.0.RELEASE.jar包下的org.springframework.web....

彻底解决tomcat6加入log4j后在linux平台下乱码的问题

最近的开发过程中发生一件非常让人苦恼的事件: 在windows下的tomcat8+jdk1.8调试没问题, tomcat6+jdk1.6测试环境也没问题, 但分发到生产环境的linux(tomcat6...

SUSE--Tomcat日志,catalina.out乱码彻底解决20170618

1.    SUSE--Tomcat日志,catalina.out乱码彻底解决20170618 解: 1.1    关键字: tomcat乱码 tomcat中文乱码 tomcat日志乱码 tomcat...

彻底解决delphi Indy10接收邮件汉字显示乱码的问题

delphi Indy10接收邮件汉字显示乱码, 直接修改Indy的代码彻底解决乱码问题。ReadStringsAsContentType, TIdtextEncoding, TIdPop3, Ret...

彻底解决win7上mysql5.6.x数据库中文乱码问题

彻底解决win7上mysql5.6.x数据库中文乱码问题 最近在用mysql数据库,发现中文乱码问题,网上查的资料都是关于以前老版的mysql中午乱码解决方案。现在楼主分享新版mysql中文乱码解决...

彻底解决Spring MVC 中文乱码 问题

1:表单提交controller获得中文参数后乱码解决方案 注意:  jsp页面编码设置为UTF-8 form表单提交方式为必须为post,get方式下面spring编码过滤器不起效果 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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