注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

Tomcat 5.5.X及以上版本的生僻字乱码解决办法  

2008-03-06 14:27:16|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
文章声明

  
作者:
傲风(aofengemail@126.com)       编写时间:2008年03月06日

网址:http://aofengblog.blog.163.com

?保留所有权利!

软件环境:Tomcat5.5.X

问题描述:

1)一般的汉字正常,如:中国,任务,管理。

2)生僻字出现乱码。如:喆,璟。



解决过程:

1、前言。在Tomcat4中,GET和POST使用相同的处理方式;从Tomcat5开始,GET和POST使用不同的处理方法。所以用POST提交正常,但用GET提交就变成了乱码。

2、页面乱码的解决方式。

    1)所有的页面编码都用GBK或GB2312。

        <%@ page contentType="text/html; charset=GBK" %>

      <meta http-equiv="Content-Type" content="text/html; charset=GBK" />

    或

      <%@ page contentType="text/html; charset=GB2312" %>

      <meta http-equiv="Content-Type" content="text/html; charset=GB2312" />


但只这个只能解决页面的显示问题。

3、表单提交(GET/POST)乱码的解决方式。
    解决方式一:
    1)打开 server.xml,找到<Connector 配置段,加上 URIEncoding="GBK" 配置项。配置示例如下:

<Connector port="8080" maxHttpHeaderSize="8192"
  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000"
  disableUploadTimeout="true"
  URIEncoding="GBK" />


表示GET方式采用GBK编码。

    2)然后再加上 useBodyEncodingForURI="true" 的配置,表示POST和GET都采用相同的编码处理方法。实际上在Tomcat5中useBodyEncodingForURI的属性默认为false,代表着GET和POST方式采用了不同的处理方法。配置示例如下:

<Connector port="8080" maxHttpHeaderSize="8192"
  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000"
  disableUploadTimeout="true"
  URIEncoding="GBK" useBodyEncodingForURI="true" />

 

解决方式二:

    1) 打开 server.xml,找到<Connector 配置段,加上 URIEncoding="GBK" 配置项。配置示例如下:

<Connector port="8080" maxHttpHeaderSize="8192"
  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000"
  disableUploadTimeout="true"
  URIEncoding="GBK"  />


表示GET方式采用GBK编码。

    2)在web.xml中添加过滤器。配置如下:

<filter>
  <filter-name>filter</filter-name>
  <filter-class>cn.aofeng.filter.CharsetFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>GBK</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

说明:

    url-pattern 中的 /* 表示过滤所有的请求。

CharsetFilter 类的源代码如下:

/**
* @author aofeng Email:aofengemail@126.com
*/
package cn.aofeng.filter;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
* 编码过滤器。
*/
public class CharsetFilter implements Filter {

// ----------------------------------------------------- Instance Variables

/**
* The default character encoding to set for requests that pass through this
* filter.
*/
protected String encoding = null;

/**
* The filter configuration object we are associated with. If this value is
* null, this filter instance is not currently configured.
*/
protected FilterConfig filterConfig = null;

// --------------------------------------------------------- Public Methods

/**
* Take this filter out of service.
*/
public void destroy() {

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

}

/**
* Select and set (if specified) the character encoding to be used to
* interpret request parameters for this request.
*
* @param request
* The servlet request we are processing
* @param result
* The servlet response we are creating
* @param chain
* The filter chain we are processing
*
* @exception IOException
* if an input/output error occurs
* @exception ServletException
* if a servlet error occurs
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

  request.setCharacterEncoding(encoding);   // 编码

  chain.doFilter(request, response);   // 转向下一个过滤器

}

/**
* Place this filter into service.
*
* @param filterConfig
* The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {

  this.filterConfig = filterConfig;
  this.encoding = filterConfig.getInitParameter("encoding");

}

// ------------------------------------------------------ Protected Methods

/**
* Select an appropriate character encoding to be used, based on the
* characteristics of the current request and/or filter initialization
* parameters. If no character encoding should be set, return
* <code>null</code>.
* <p>
* The default implementation unconditionally returns the value configured
* by the <strong>encoding</strong> initialization parameter for this
* filter.
*
* @param request
* The servlet request we are processing
*/
protected String selectEncoding(ServletRequest request) {

  return (this.encoding);

}

}

 


注意:

    生僻字:璟,喆 等不在GB2312的字符集内,GBK才支持这些生僻字,因此,在配置时需将编码设置成GBK才能解决生僻字的乱码问题。


通过上述方式,可以解决页面的乱码及GET和POST提交时汉字乱码的问题。

<正文结束>

  评论这张
 
阅读(2378)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017