软件环境:Tomcat5.5.X
问题描述:
1)一般的汉字正常,如:中国,任务,管理。
2)生僻字出现乱码。如:喆,璟。
解决过程:
1、前言。在Tomcat4中,GET和POST使用相同的处理方式;从Tomcat5开始,GET和POST使用不同的处理方法。所以用POST提交正常,但用GET提交就变成了乱码。
2、页面乱码的解决方式。
1)所有的页面编码都用GBK或GB2312。
%>
http-equiv="Content-Type" content="text/html; charset=GBK"
/>
或
page contentType="text/html; charset=GB2312" %>
http-equiv="Content-Type" content="text/html; charset=GB2312"
/>
但只这个只能解决页面的显示问题。
3、表单提交(GET/POST)乱码的解决方式。
解决方式一:
1)打开
server.xml,找到
URIEncoding="GBK" 配置项。配置示例如下:
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方式采用了不同的处理方法。配置示例如下:
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,找到
URIEncoding="GBK" 配置项。配置示例如下:
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
cn.aofeng.filter.CharsetFilter
encoding
GBK
filter
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
protected String encoding = null;
protected FilterConfig filterConfig = null;
// ---------------------------------------------------------
Public Methods
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding); // 编码
chain.doFilter(request,
response); //
转向下一个过滤器
}
public void init(FilterConfig filterConfig) throws
ServletException {
this.filterConfig =
filterConfig;
this.encoding =
filterConfig.getInitParameter("encoding");
}
// ------------------------------------------------------
Protected Methods
protected String selectEncoding(ServletRequest
request) {
return (this.encoding);
}
}
注意:
生僻字:璟,喆
等不在GB2312的字符集内,GBK才支持这些生僻字,因此,在配置时需将编码设置成GBK才能解决生僻字的乱码问题。
通过上述方式,可以解决页面的乱码及GET和POST提交时汉字乱码的问题。