响应乱码的原理和解决

        想向浏览器写出一段数据,只要将这段数据写入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()是互斥的,调用了其中的一个,就不能再调用另一个。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值