0.README
Tomcat默认的编码格式是ISO8859-1
,而网络字符流通用的编码格式是UTF-8
,因此会出现一些中文字符乱码问题,本文提出了在response
、request
、和下载文件的三种情况下的解决方案。
1.servlet是什么
Servlet是一个运行在Web服务器上的Java小程序,通常通过HTTP(the HyperText Transfer Protocol,超文本传输协议)来响应来自Web客户端的请求。
实现方式:
javax.servlet
是一个接口,实现该接口的类主要有两个:javax.servlet.GenericServlet
, javax.servlet.http.HttpServlet
,前一个是后一个的父类,前一个与传输协议无关,后一个针对HTTP协议。
所以实现方式是继承这两个实现类。
2.中文乱码问题
(1) 字节流响应时
问题描述:
OutputStream os = response.getOutputStream;
os.write("中文内容".getBytes);
// 会使用服务器本地默认编码,而客户端也会用本地默认编码解析,因此可能会出错
解决方法:
- 1.用响应头
response.setHeader("Content-Type", "text/html;charser=UTF-8");
os.write("中文内容".getBytes("UTF-8"));
- 2.用meta标签模拟
os.write("<meta http-equiv='Content-Type' content="text/html;charser=UTF-8"); // 和方法1类似
os.write("中文内容".getBytes("UTF-8"));
- 3.Servlet特性(推荐)
response.setContentType("text/html;charser=UTF-8");
os.write("中文内容".getBytes("UTF-8"));
(2) 字符流响应时
问题描述:
PrintWriter pw = response.getWriter();
pw.write("中文内容"); // Tomcat服务器默认采用iso-8859-1,会乱码
解决办法:
- 设置Tomcat输出编码
response.setCharacterEncoding("UTF-8"); // 两个功能:1.告知Tomcat字符串输出编码;2.告知客户端编码
(3) 下载中文名文件时
问题描述:
// 设置响应头
response.setHeader("Content-Disposition", "attachment;filename=中文.jpg"); // 文件名会乱码
response.setHeader("Content-Type", "application/octet-stream");
// 找到文件位置
String path = getServletContext().getRealPath("/WEB-INF/中文.jpg");
// 输出流
OutputStream os = response.getOutputStream();
InputStream is = new FileInputStream(path);
int len = -1;
byte[] buffer = new byte[1024];
while((len = is.read(buffer)) != -1){
os.write(buffer, 0, len);
}
os.close();
is.close();
解决办法:
- URL编码
response.setHeader("Content-Disposition",
"attachment;filename="+URLEncoder.encode("中文.jpg","UTF-8");