本文主要讲述response乱码原因及response.setCharacterEncoding("UTF-8")和response.setContentType("application/csv;charset=utf-8")不生效的原因及解决方法
一、response乱码
1、首先,response返回有两种,一种是字节流outputstream,一种是字符流printwrite。
申明:这里为了方便起见,所有输出都统一用UTF-8编码。
先说字节流,要输出“中国",给输出流的必须是转换为utf-8的“中国”,还要告诉浏览器,用utf8来解析数据
2、再说字符流,要输出中国,需要设置response.setCharacterEncoding(“UTF-8”);
二、response.setCharacterEncoding(“UTF-8”)和response.setContentType(“application/csv;charset=utf-8“)不生效的原因及解决方法
错误的代码示例
PrintWriter out = null;
out =response.getWriter();
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName, "UTF-8"));
response.setContentType("application/csv;charset=utf-8");
原因:
- request.getRequestDispatcher方式跳转到SecondServlet后,FirstServlet与SecondServlet共有同一个response。
- response.setCharacterEncoding(“UTF-8”)语句执行之前执行了response.getWriter()语句。
基于以上两点原因,即使SecondServlet中response.setCharacterEncoding(“UTF-8”)语句执行之前没有执行了response.getWriter()语句,但是FirstServlet中执行了response.getWriter()语句,同样会使response.setCharacterEncoding(“UTF-8”)不生效。
正确的代码示例:
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName, "UTF-8"));
response.setContentType("application/csv;charset=utf-8");
PrintWriter out =response.getWriter();