如今将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。 javascript
1)JSP页面中显示中文乱码 html
在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gb2312" %> java
2)表单提交乱码 web
表单提交时(post和Get方法),使用request.getParameter方法获得乱码,这是由于tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不一样,下面分别说明。
(1)POST处理
对post提交的表单经过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理以前被调用,能够在这里改变参数的编码方式,过滤器的代码以下: tomcat
- package example.util;
-
- 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;
-
- 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,
- <strong><span style="color: #ff0000;"> FilterChain chain) throws IOException, ServletException {
-
- if (ignore || (request.getCharacterEncoding() == null)) {
- String encoding = selectEncoding(request);
- if (encoding != null) {
- request.setCharacterEncoding(encoding);
- }
- }</span>
- </strong>
- // 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);
-
- }
-
- }
文中红色的代码即为处理乱码的代码。
web.xml文件加入过滤器 app
- <filter>
- <filter-name>Encoding</filter-name>
- <filter-class>
- example.util.SetCharacterEncodingFilter
- </filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>gbk</param-value>
- <!--gbk或者gb2312或者utf-8-->
- </init-param>
- <init-param>
- <param-name>ignore</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>Encoding</filter-name>
- <servlet-name>/*</servlet-name>
- </filter-mapping>
(2) Get方法的处理
tomcat对post和get的处理方法不同,因此过滤器不能解决get的乱码问题,它须要在其余地方设置。
打开<tomcat_home>\conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:
post
- <Connector port="8080" maxHttpHeaderSize="8192"
- maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
- enableLookups="false" redirectPort="8443" acceptCount="100"
- connectionTimeout="20000" disableUploadTimeout="true" <span style="color: #ff0000;">URIEncoding="GBK"</span> />
* 注意修改后从新启动tomcat才能起做用。 this