要解决中文乱码首先要清楚有哪些地方可以指定编码,最简单粗暴的方式就是把所有可以指定编码的地方都指定成统一的编码比如utf-8,如果不指定成统一的也要清楚知道在每个步骤中编码是什么格式,以便从一个步骤到另一个步骤时正确转换编码。
有以下这些地可以分别决定编码格式
·JSP文件实际保存的编码
·告知web容器JSP文件保存的编码
·告知web容器通过POST方式提交的内容编码
·告知web容器通过GET方式提交的内容编码
·告知浏览器服务器返回的页面内容编码
·JSP文件实际保存的编码
一般编辑器保存时都可以指定,这个没什么好说的,中文系统默认的ANSI是GB2312格式,很多编辑器默认使用这个,也有一些编辑器默认UTF-8,UTF-8是扩展性比较强的编码,包含中文日文韩文,它的设计上的扩展性使得它没有最大编码容量,是比较好的编码格式。
·告知web容器JSP文件保存的编码
通过在JSP的头部写上
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
在MyEclipse中可以修改JSP创建模板中pageEncoding的编码,Window-Preferences-MyEclipse-Files and Editors-JSP
修改Encoding为ISO 10646/Unicode(UTF-8)
·告知web容器通过POST方式提交的内容编码
和
·告知浏览器服务器返回的页面内容编码
分别是通过JSP中request和response对象的setCharacterEncoding方法完成
可以通过在WEB-INF/web.xml文件中添加Filter来完成
在web-app下级添加
<!-- 配置过滤器 -->
<filter>
<filter-name>filter</filter-name>
<filter-class>com.ff.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
com/ff.filter/MyFilter.java
package com.ff.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;
public class MyFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charSet=utf-8"); //和上面一句是等效的,但是据说在某些低版本的Servlet中上面一句无效
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
·告知web容器通过GET方式提交的内容编码
在Tomcat服务器的server.xml配置中指定URIEncoding="UTF-8"
<Connector port="80" protocol="HTTP/1.1"
URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" />
最后有一点补充,就是在下载文件的文件名中如果包含中文,通过
response.setHeader("Content-Disposition", "attachment; filename=\" + fileNameISO + "\"" );
指定的时候似乎不得不使用ISO8859-1,我还不知道如何将这里的编码设置改掉,所以下载文件名中包含中文时使用以下方法解决
·指定下载文件名包含中文
在指定下载文件名时如果要通过Content-Disposition指定带有中文字符的文件名,必须转换成ISO8859-1编码来指定。
String fileNameISO = new String(fileName.getBytes("utf-8"), "ISO8859-1");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileNameISO + "\"" );