response.setContentType()和response.setCharacterEncoding()使用区别及统一处理request和response编码
引入
在Servlet中,我们常常会处理服务器与浏览器之间传输的时候,中文乱码问题。
乱码原因:我们知道浏览器的编码方式是GBK,而Tomcat服务器中编码方式是utf-8,如果他们编码不一致,就会出现乱码
有一个比较好的解决方式是在doGet中加入两行代码
第一行处理浏览器发送给服务器数据的乱码问题,第二行处理服务器发回给浏览器数据的乱码问题
准确来说,这个已经是蛮好的解决方法了。就在今天下午写response的时候我突然看到了response.setCharacterEncoding()
,我就在想,能不能有统一的方法处理request和response,让他们都用setCharacterEncoding()?
像这样↓
正文
在我兴致勃勃的尝试了之后,发现失败了。还是会出现乱码,这是我就想知道response.setContentType()
和response.setCharacterEncoding()
区别在哪?为什么response.setContentType("text/html;charset=utf-8")
就可以解决问题,而response.setCharacterEncoding("utf-8");
却不行?
在查阅资料后,我了解到
response.setContentType("text/html;charset=utf-8")
等价于
response.setCharacterEncoding("utf-8");
response.setHeader("content-type", "text/html");
这两句意思是服务器响应给浏览器指定的编码,并且告诉浏览器根据服务端发回来的编码(utf-8)按照html的格式去读出来。所以浏览器本来准备用gbk解码但是后来被迫以utf-8
的方式读了出来,那自然是没有问题了
接下来我们看
response.setCharacterEncoding("utf-8")
这句意思是服务器响应给浏览器的编码为“utf-8”,就这么一件事情!
我们知道这次的浏览器是没有被指派解码方式的,所以浏览器自然是用自己的默认gbk解码方式,而服务器发回来的编码确实utf-8
,那自然乱码啦
所以如果非要用response.setCharacterEncoding()
,那应该是服务器发回gbk
编码的内容,让浏览器用gbk
读取,那么就没问题啦,所以应该这样写↓
response.setCharacterEncoding("gbk")
这时就做到了统一的方法处理request和response的编码!