content-type 响应头包含两部分内容:
一、设置服务器发送给浏览器的数据类型;
1、response.setContentType("text/html"):浏览器会将当前页面按照 html 进行解析
浏览器解析结果为:
2、response.setContentType("text/xml"):浏览器会将当前页面按照 XML 进行解析
浏览器解析结果为:
3、response.setContentType("image/png"):浏览器会以图片的方式解析当前页面
浏览器解析结果为:
4、设置以下载方式打开文件:
浏览器解析结果为:
二、设置服务器发送给浏览器的数据编码方式
没有指定编码时浏览器解析结果为:乱码
乱码原因:
浏览器和服务器通信底层是通过 socket 实现的,而 socket 数据传输只能是字节数据,所以 response.getWriter().write("data") 发送的字符数据需要先转换成字节数据。
tomcat 服务器默认使用的编码为 iso-8859-1,所以服务器将字符数据转换成字节数据的方法为:byte[] buf = data.getBytes("iso-8859-1"); 而浏览器使用的编码方式为 UTF-8,即浏览器解析服务器发送过来的数据使用的方法为:new String(buf, "utf-8");由于编码方式和解码方式不一致,所以导致乱码的产生。
设置服务器编码方式还有一个方法:response.setCharacterEncoding("utf-8"); 效果和 response.setContentType("text/html;charset=utf-8"); 一样。
如果服务器使用 response.getOutputStream().write(b); 方式发送数据给浏览器,则 response.setCharacterEncoding("utf-8"); 没有效果,因为 response.getOutputStream().write() 发送的就是字节数据,不需要服务器再进行编码了。
注意:服务器使用 utf-8 编码时,如果浏览器不是使用 utf-8 编码,也会出现乱码;如下:把浏览器的编码方式改为 GB2312 时,中文也会变成乱码
三、完美解决中文乱码问题:
1、前端网页通过 <meta charset="UTF-8"> 方法指定 form 表单数据使用的编码方式;
2、服务器端通过 request.setCharacterEncoding("utf-8"); 方法指定服务器解析浏览器发送数据的解码方式;
3、服务器端通过 response.setContentType("text/html;charset=utf-8"); 方法指定服务器发送给浏览器的数据采用的编码方式;