首页 > 开发 > PHP > 正文

彻底解决Tomcat 5.0.19中文乱码(过滤器)

2024-05-04 23:04:29
字体:
来源:转载
供稿:网友

  一、include的页面乱码

  现象:include进来的页面出现乱码,其它页面正常。

  原因:tomcat在缺省情况下使用iso-8859-1编码,但是在include时有时tomcat不能正确根据外层.jsp文件的编码解析include进来的文件,造成include进来的文件中的中文乱码。

  解决:这儿可以有很多解决办法,但是对于我们的中文环境,从根本上的解决办法是将tomcat 5.0.19的核心缺省编码从iso-8859-1修改为gbk 。可以在下面地址下载修改过的jar文件,

  jasper-compiler.jar,jasper-runtime.jar位于/common/lib下,其它位于/server/lib下,将新的.jar文件替代原.jar即可。
  
  二、提交的数据乱码

  现象:通过表单提交的数据出现乱码。

  原因:原因未明。可能是tomcat在接收到请求后,并没有能够根据request中的信息提前正确的编码方式。

  解决:可以添加一个设置字符集的filter。

//=================初学者注意,请将此文件放在web-inf/classes/filters下,
//注意先以setcharacterencodingfilter.java保存,然后编译一下,推荐使用eclipse
package myaddrbook;
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.unavailableexception;

/**
 * @author administrator
 *
 * todo 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - java - 代码样式 - 代码模板
 */
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 {

  // conditionally select and set the character encoding to be used
  if (ignore || (request.getcharacterencoding() == null)) {
   string encoding = selectencoding(request);
   if (encoding != null)
    request.setcharacterencoding(encoding);
  }

  // pass control on to the next filter
  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);
 }

}

//==================这段代码是我在网上摘录的,因为不知到出处所以无法标明作者
//然后将下面<filter>开始的代码加入到web.xml中,它位于web-inf下。
//我的qq:22070699
//配置web.xml

<!--  set character encoding-->
   
    <filter>
  <filter-name>set character encoding</filter-name>
  <filter-class>myaddrbook.setcharacterencodingfilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>gbk</param-value>
  </init-param>
 </filter>
 
 <filter-mapping>
  <filter-name>set character encoding</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 
    <!--   set character encoding-->

菜鸟学堂:
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表