Request和Response中文乱码问题的解决方案和区分
首先,在刚接触这个中文乱码问题的时候,还是比较混乱的,因为针对request和response各自都有自己的解决方案,而且思路相似,方法也很相似,又针对get和post两种提交方式,分两种解决中文乱码的方案;针对response响应,分字节流和字符流的响应方式,所以,是两个大的方向,四个小的方向。
一:Request对象接收中文数据
1.1Post方式接收中文
/** * 演示Post方式提交,解决中文乱码问题 */ public class RequestDemo extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 产生乱码的原因: * post提交的数据在请求体中,request对象接收到数据之后,会将数据放入到request缓冲区,缓冲区有默认编码:ISO-8859-1:不支持中文; * * 解决方案: * 将request缓冲区的编码更改就行了 * */ request.setCharacterEncoding("UTF-8"); String parameter = request.getParameter("name"); System.out.println("姓名:"+parameter); }
1.2get方式提交接收中文
/** * 产生乱码的原因: * get提交的数据在请求行url后面,在地址栏其实已经进行了一次编码(默认:ISO-8859-1:对中文不友好) * * 解决方案: * 将存入request缓冲区的数据以默认的方式接收,但以UTF-8的方式解码 */ String name=request.getParameter("name"); String param=new String(name.getBytes("ISO-8859-1"),"UTF-8"); System.out.println("姓名:"+parameter);
二:Response响应数据的时候中文乱码问题及解决方案
2.1使用字节流方式响应中文
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * 使用字节流响应中文 */ //ServletOutputStream outputStream = response.getOutputStream(); //outputStream.write("中文".getBytes()); /** * 以上这种方式是否能够避免不出现中文乱码问题呢? * 不一定: * 中文乱码的产生与中文转化成字节数组和浏览器打开方式(打开时采用的默认字符集)有关 * * 解决方案: * 将中文转化成数组的字符集和浏览器打开时候的字符集一致就行 */ ServletOutputStream outputStream = response.getOutputStream(); //设置浏览器打开时默认的字符集 response.setHeader("Conten-Type", "text/html;charset=UTF-8"); //设置中文转换成字节组的字符集编码 outputStream.write("中文大师".getBytes("UTF-8"));
2.2使用字符流的方式响应中文
/** * 字符流的方式响应中文 */ response.getWriter().print("中文大侠"); /** * 使用上述代码向页面输出中文是否会产生乱码? * 一定乱码 * 原因: * 字符流是有缓冲区的,response获得字符流,response设计默认的缓冲区编码是ISO-8859-1。 * 解决: 设置response获得字符流缓冲区的编码字符集(这句话体现在:response.getWriter(),详情请看API)和 * 设置浏览器默认打开时候采用的字符集一致即可。 * */ // 设置浏览器打开时默认的字符集 response.setHeader("Conten-Type", "text/html;charset=UTF-8"); //设置response获得字符流缓冲区的编码字符集 response.setCharacterEncoding("UTF-8"); //响应到浏览器 response.getWriter().print("胡春春和阿珠"); //下面是一种简化的方式(推荐记住和掌握) response.setContentType("text/html;charset=UTF-8"); response.getWriter().print("胡春春和阿珠");