响应乱码的原理和解决

        想向浏览器写出一段数据,只要将这段数据写入HTTP响应的实体内容中就行了。
        ServletOutputStream getOutputStream()
              Returns a ServletOutputStream suitable for writing binary data in the response.
        PrintWriter getWriter()
              Returns a PrintWriter object that can send character text to the client.
        这两个方法是指向response缓冲区的流,写入的数据最终会成为HTTP响应的实体内容。所以,只要通过这俩流,就可以将数据打给浏览器了
        (1)字节流
                OutputStream out = response.getOutputStream();
                //out.write("中国".getBytes());//如果不指定编码,用的就是平台码(gbk)
                response.setHeader("Content-Type","text/html;charset=utf-8");//通知浏览器用utf-8打开
                out.write("中国".getBytes("UTF-8"));//--通过utf-8发送
            
        此种方式如果想要防止中文乱码,可以设置响应头Content-Type,通知浏览器当前发送过去的数据是什么编码格式,浏  览器自动就会用这个编码格式解析数据了。
        如果不通知,则浏览器默认使用平台码解析数据
        (2)字符流
                response.getWriter().write("xxx");
        利用字符流向外输出数据时,服务器默认用iso8859-1将字符转为字节后输出,如果输出汉字,由于iso8859-1中没有汉字字符,产生乱码
        此时可以设置response.setCharacterEncoding("")通知服务器用什么编码集将字符转为字节
        再通过response.setHeader("Content-Type","text/html;charset=xxx")通知浏览器以什么编码打开
        只要发送和打开时编码一致就不会有乱码问题了。
            
     另外,只要设置过response.setHeader("Content-Type","text/html;charset=xxx")服务器自动识别编码会自动设置response.setCharacterEncoding("")
       而response.setHeader("Content-Type","text/html;charset=utf-8")可以简写成response.setContentType("text/html;charset=utf-8");
                
        **最终的结论:
            只要在输出数据之前,设置response.setContentType("text/html;charset=xxxx");就可以解决乱码问题,一行代码,搞定所有响应乱码


        **细节1:从response中获取的流,会在Service方法结束后由服务器自动关闭,我们自己不需要关。
        **细节2:getWriter()和getOutputStream()是互斥的,调用了其中的一个,就不能再调用另一个。

猜你喜欢

转载自blog.csdn.net/yyws2016/article/details/80591079