Respons_服务器输出字符和字节数据到浏览器及造成乱码原因的解析

## 服务器输出字符数据到浏览器
        ※步骤:
           1.获取字符输出流
              (这个流是你获取的,不是你创建的,就意味着这个流的流向是流到客户端浏览器的)
           2.输出数据

在这里插入图片描述
              (PrintWriter有两种写书数据的方式,一种是普通的write方法,另一种是用print相关的方法,之前学习PrintWriter,这个流的print方法可以自动刷新,不用去刷新,他自己会把数据写出缓冲区,那么这个这个地方,获取的response是输出流这个response获取的将来不需要去刷新这个流,你即使调用write方法也不要刷新,因为这个流是response获取的而response在一次响应完成之后会自动的被销毁,那么同时他的流获取的也会自动的关闭掉,所以用write方法同样可以达到不刷新就把数据写出缓冲区的效果)
        如下的页面效果:
在这里插入图片描述
        F12抓包查看响应的消息体效果图:
在这里插入图片描述
              (其实这个数据就是响应的消息体,可以打开F12抓包查看,就是说这个字符串会被浏览器解析,展示到页面上,其实呢,如果想写一些html标签也是没问题的,写了之后,浏览器会自动解析这个标签。把他展示出来相对的样式,如下下图,将来浏览器解析到这个h1标签后,就会显示这玩意是比较大的字号,并且是加粗的)

        在write里写html标签的效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

        ※注意:
            ※乱码问题:
                 1. PrintWriter pw = response.getWriter();获取流的默认编码是ISO-8859-1
                 2.设置该流的默认编码
                 3.告诉浏览器响应体使用的编码(简单的形式,获取流之前设置编码)
                     ※response.setContentType(“text/html;charset = utf-8”);
        没设置编码时会出现乱码如下效果图:
在这里插入图片描述
在这里插入图片描述
## 乱码原因解析
              (乱码问题(无非就是编码和解码用的码表(字符集)不一致,分析:输入数据就相当于一个编码过程,然后在浏览器相当于一个解码过程,那么解码用的字符集是什么呢?浏览器打开的默认字符集跟你当前操作系统的语言环境有关系,我们现在用的操作系统是芝中文的Window操作系统,那么打开浏览器默认的字符集,或者编码表就是gbk,或者说GB2312,GB2312表示国标码,GBK是国标扩展码,可以认为是一回事,都是中文的码表,只支持中文,那么这样可以判断,服务器用的一定不是GB2312,那么服务器用的是啥呢,现在我们有一个流对象,这个流对象是获取出来的,不是new出来的,如果是本地new出来的,那么new出来的字符流,如果你的电脑是中文操作系统,他也是gbk的,但是你是获取出来的流对象是谁返回给你的,是Tomcat,因为response对象是由Tomcat实现的,那么Tomcat弄出来的,那么换句话,Tomcat代码是谁写的,反正不是中国人写的,那么它用的编码是拉丁编码ISO-8859-1,也就是response获取出来的字符输出流的编码是ISO,那么ISO编码用GBK解码肯定会乱码,所有我们只要去设置流的编码为GBK就可以解决了,所以就是在获取流之前设置好流的编码为GBK,但是这也只是种巧合,因为我已经明确地知道了服务器设了GBK,我也明确知道客户端用的是GBK,我才可以这样设置,但是将来有点人说,我的浏览器就是UTF-8,那么就意味着你设置GBK就不好使了,如果你设置为了utf-8,那么该乱的还是乱码,所以光设置一行是不行的,还得告诉浏览器服务器发送的消息体数据的编码,然后建议该浏览器使用该编码解码,response.setHeader(“content-type”,“text/html;charset=utf-8” );content-type就是响应头的一个键,不区分大小写,text/html;文本数据里边用的是子类形式,html,后边写的就是编码,response.setCharacterEncoding(“utf-8”);可以省略,那一句可以完成)

        明确了客户端的是GBK:
在这里插入图片描述
在这里插入图片描述

        如果不明确客户端是什么编码,设置一个utf-8,还是会乱码:
在这里插入图片描述
在这里插入图片描述

        所以还需要设置响应头,告诉浏览器发送的消息体数据的编码,然后建议该浏览器使用该编码解码
在这里插入图片描述
在这里插入图片描述
        总结:
              (response.setContentType(“text/html;charset = utf-8”);这一句话就包括了设置了流的编码以及告诉浏览器应该用什么解码,写后端代码时,直接先写这一句话)

## 服务器输出字节数据到浏览器
        ※步骤:
           1.获取字节流
           2.输出数据
在这里插入图片描述
              (ServletOutputStream直接当做OutputStream使用就可以了,第二步写数据的时候,字节流可以写任意的数据,想写字符也可以,想写纯文本也可以,想写字节的非纯文本的也可以,比如先写个纯文本的数据hello,然后hello是字符串,要把它改成字节,获取字节数组就行了)
在这里插入图片描述
在这里插入图片描述
              (如果是输出中文,因为中文.getBytes(),getBytes()默认情况下使用的编码就是gbk,而浏览器也是,所以是不会乱码的,效果如下图)
在这里插入图片描述
在这里插入图片描述
              (如果设置为utf-8换才就会出现乱码,因为没有告诉浏览器用什么解码,他默认用gbk就乱码了,效果如下图)
在这里插入图片描述
在这里插入图片描述
              (而加上response.setContentType(“text/html;charset=utf-8”);浏览器就知道要用什么来解码了,就不会乱码)
在这里插入图片描述
        总结:
              (所以呢字节流输出字符数据要注意要用getBytes()这种方式来获取字节数组,当然,很少会使用字节流去输出这种纯文本的数据,字节流一般是输出图片啊这些数据。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值