1 | String name = new String(request.getParameter("name").getBytes("IOS-8859-1"),"UTF-8"); |
无论从浏览器提交时中文参数是什么编码格式,到达服务器时因为 Tomcat 编码方式的原因,采用 ISO-8859-1 的方式给解析成了乱码
request.getParameter(“name”) 获取到的就是一个通过 ISO-8859-1 方式解析之后的乱码,那么我们通过 getBytes(“ISO-8859-1”) 将它反解成原有编码的字符数组,相当于打回原形,这是一个正确的字符数组,然后通过 String 的构造方法将这个正确的字符数组转成 UTF-8 编码的字符串。因为代码相对简单,因此通常采用这种方式。
1 2 | request.setCharacterEncoding("UTF-8"); String value = requst.getParameter("name"); |
使用字节流不一定会出现中文乱码,取决于操作系统,工作空间以及浏览器打开页面时采用的编码。如果两端编码一致,则不会出现中文乱码,不一致则出现乱码。
1 2 | response.getOutPutStream.write("中文".getBytes("UTF-8")); response.setHeader("Content-Type","text/html;charset=UTF-8"); |
字符流总之是设置输出时的字节数组编码和浏览器解析时的编码一致。中文转成字节数组的时候,如果 IDE 工作空间的编码正好和浏览器一致,可以不用设置字符数组取出时的编码,但是为了保险起见,建议还是设置。
使用字符流一定会出现中文乱码,HttpServletResponse 使用的字符流是有缓冲区的,缓冲区使用的默认编码是 IOS-8859-1,压根儿就不支持中文。
1 2 3 | response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Type","text/html;charset=UTF-8"); response.getWriter().println("中文"); |
1 2 | response.setContentType("text/html;charset=UTF-8"); response.getWriter().println("中文"); |
1 2 3 4 5 6 7 8 9 10 11 | // 1.接收参数,解决 GET 请求参数中文乱码,目的是将中文文件名转成正常中文 String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8"); // 根据浏览器的类型处理保存的中文文件名的乱码问题: String agent = request.getHeader("User-Agent"); if(agent.contains("Firefox")){ filename = base64EncodeFileName(filename); }else{ filename = URLEncoder.encode(filename,"UTF-8"); } // 2.2设置Content-Disposition头 response.setHeader("Content-Disposition", "attachment;filename="+filename); |
1 2 3 4 5 6 7 8 9 10 11 12 | // 参数为中文文件名 public static String base64EncodeFileName(String fileName) { BASE64Encoder base64Encoder = new BASE64Encoder(); try { return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName .getBytes("UTF-8"))) + "?="; } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(e); } } |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |