response 发送数据的乱码解释及解决

向客户端发送数据

getOutputStream()

getWriter()

**字节流发送数据的中文乱码问题

服务器端指定了用utf-8来发送数据,浏览器在接受数据时,如果不指定将使用默认的平台码GBK,编解码不一致导致乱码。

解决方案;

response.setHeader("Content-Type", "text/html;charset=utf-8");// 通知浏览器使用utf-8打开服务器发送过去的数据

esponse.getOutputStream().write("中国".getBytes("utf-8"));// 指定编码为utf-8

 

**字符流发送数据的中文乱码问题

利用字符流发送数据,底层还是要转成字节。服务器端如果不手动指定,服务器默认会使用iso8859-1码表,由于里面没有中文汉字,所以服务器端发送给客户端就是一堆乱码(显示???),客户端不管使用什么码表都无法转成正常的字符。

 

* 服务器会根据getCharacterEncoding()方法返回的编码来发送数据,如果没有指定,该方法默认返回iso8859-1

 

* 解决方案:

第一步,需要指定服务器发送数据使用utf-8

response.setCharacterEncoding("utf-8"); //通知服务器使用utf-8来发送响应实体中数据

第二步:需要指定浏览器在接收数据时也使用同一个编码来打开数据

response.setHeader("Content-Type", "text/html;charset=utf-8");

等价于<==>

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

 

* 在通知浏览器使用什么编码接受服务器发送的数据时,服务器很智能,会使用相同的编码来发送数据,所以指定服务器以什么编码发送数据的代码可以省略不写

 

**总结:不管是字符流还是字节流,解决乱码问题,可以用一行代码搞定:

response.setContentType("text/html;charset=xxx");

 

**getOutputStream()和getWriter() 这两个方法是互斥的, 在一次请求当中调用了其中的一个, 就不能再调用另一个!!!

 

**在调用完getOutputStream()或getWriter()方法之后,不需要手动去关闭流,服务器会自动帮我们去关闭!!!

 

**这个两个方法获取到的流并不是指向客户端的流,而是指向response缓冲区的流,通过流将数据写入response缓冲区,service方法执行结束,请求回到服务器,由服务器将数据组织成响应消息打给浏览器!!

猜你喜欢

转载自blog.csdn.net/m0_37461645/article/details/81637367