服务器端是把要发送的信息进行编码为对应为字节流,发送给浏览器。浏览器再对接收到的字节流信息进行解码显示。
目录
1 原理过程分析
服务器端:首先服务器端要把信息转换成成字节流。
若你指定编码格式,服务器端使用你指定的编码格式进行编码转换成字节流。
若你没有指定编码格式,服务器端会使用它的默认编码格式 ISO-8859-1 转换成字节流。
接着服务器端把转换好的字节流发送给浏览器。
浏览器端: 再接着就是浏览器的工作了,浏览器拿到这些字节流,要进行解码显示。
浏览器首先会从(2.1)响应头,或(2.2)响应体中进行查找,看是否可以找到指定的编码进行解码显示。
若找到,则按照服务器端发过来的响应信息中指定的编码进行解码显示。
若找不到,则按照浏览器端,(2.3)自己默认的编码格式进行解码显示。
2 服务器端和浏览器端编码设置
服务器端的编码,两种方式设置服务器编码字符数据的编码方式。
(1) response.setContentType("text/html;charset=utf-8");(推荐使用)
(2) response.setCharacterEncoding("utf-8");
浏览器端的解码,发送之前你需要设置响应体的 mime 类型,如何设置 ?
(即浏览器要找的解码格式)两种设置方法。
(1)设置在响应头中 response.setContentType("text/html;charset=utf-8");(推荐使用)
(2)在响应体中设置
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">
3 推荐方法
response.setContentType("text/html;charset=utf-8");
设置 mime 类型,同时设置数据的编码方式,对服务器和客户端都有效。
响应体数据要使用流的形式进行发送
两种流的形式:
(1)字节流 OutputStream out = response.getOutputStream();(任意类型)
(2)字符流 PrintWriter writer = response.getWriter();(一般的字符)
4 代码示例
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServeAndClientEecodeAndDncodeServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html;charset=utf-8");// 设置 mime 类型,同时设置数据的编码方式,对服务器和客户端都有效!
// 响应要使用流的形式发送
// 1 使用字节流形式发送
// response.getOutputStream().write("使用字节流的形式发送!".getBytes("utf-8"));//字节流,字符串转换为字节流,是要指定编码的。
// 2 使用字符流形式发送
response.getWriter().write("使用字符流的形式发送!");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doGet(request, response);
}
}