咕噜是个大胖子 2018-07-30 07:18 采纳率: 0%
浏览 637
已采纳

Servlet response发送中文数据问题

1、如下设置响应数据时,浏览器默认解码数据使用gbk,项目中getBytes也是默认使用gbk进行编码,因此浏览器显示正确,但是F12查看具体的响应是乱码

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {


        ServletOutputStream outputStream = response.getOutputStream();

        String dataString="测试";

        outputStream.write(dataString.getBytes(""));         

    }

2、如下设置相应数据时,浏览器解码数据使用utf-8,项目中getBytes也是使用utf-8进行编码,因此浏览器显示正确,F12查看具体的响应也是正确的

         response.setContentType("text/html;charset=utf-8");

        ServletOutputStream outputStream = response.getOutputStream();

        String dataString="测试";

        outputStream.write(dataString.getBytes("utf-8"));

3、因此产生了疑问,数据编码成字节的格式与浏览器解码字节的格式都一致的情况下,为什么用gbk响应这里是乱码,而用utf-8响应这里是正确的?

4、看了一些视频教程,有解释为http传输数据时始终使用的是ISO8859-1对数据进行了二次解码。但是也没有解决我上述的疑问,根据视频教程的解答,当程序中用utf-8编码成字节写入流中,http传输时使用ISO8859-1可以正确编码成字符,因此F12查看的时候是正确的字符;当使用gbk编码成字节写入流中时,http传输使用ISO8859-1不能正确编码成字符,所以F12查看是乱码

希望各位有经验的朋友帮忙回答下,谢谢

  • 写回答

6条回答 默认 最新

  • _zming 2018-07-30 08:36
    关注

    http传输数据时始终使用的是ISO8859-1对数据进行了二次解码这--个不敢苟同
    你需要了解下tomcat响应的流程:
    response.setContentType("text/html;charset=utf-8");//#1
    这行代码有两个含义1.响应给浏览器的时候添加一个content-type的头,让浏览器知道字节数据的转码类型
    2.当你通过response。getWriter()。pintln(“xxx”).写入字符串的时候,tomcat会根据你设置的contenttype(utf-8)将字符转换成字节传送到浏览器,
    如果你是通过response.getOutputStream()。wite(byte[] data),tomcat不做任何处理直接通过socket输出到浏览器。
    正因为有了代码#1所以response。getWriter()。pintln(dataString)和 outputStream.write(dataString.getBytes("utf-8"));是等价的。

    再看看下面这段代码:
    ServletOutputStream outputStream = response.getOutputStream();

        String dataString="测试";
    
        outputStream.write(dataString.getBytes(""));  //dataString.getBytes("")以系统默认编码gbk进行字节转换
    
                由于没有调用response.setContentType设置编码类型,此时response。getWriter()。pintln(“xxx”)将会以tomcat默认的iso8859-1,将字符串转成二进制发送出去。但由于你通过 outputStream.write(dataString.getBytes(""));写的是字节,所以tomcat不会做任何特殊处理,直接输出。但由于你没有设编码类型,于是tomcat在响应中不包含头信息,此时浏览器就无法判断字节的实际编码,只能用系统默认编码gbk去解。
                而f12工具乱码和浏览器显示不是一回事,工具只是一个插件不代表浏览器行为。工具可能会去找响应的头,如果没有头会用一个默认的编码去解可能是utf8或其他,又或者总是使用utf8,要知道原因,也将你的代码示例1加个gbk的响应类型response.setContentType(“charset=gbk”)看看工具是否还是乱码
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误