zoukankan      html  css  js  c++  java
  • response小结(一)——用response向客户端输出中文数据(乱码问题分析)

       Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象。request和response对象既然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。

    response常见应用(一):向客户端输出中文数据

     1 package com.yyz.response;
     2 
     3 import java.io.IOException;
     4 import java.io.OutputStream;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 //输出中文的问题
    11 public class ResponseDemo extends HttpServlet {
    12 
    13     public void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         String data = "中国";
    16         OutputStream out = response.getOutputStream();
    17         out.write(data.getBytes());
    18         /**
    19          *     out.write(data.getBytes());这句代码涉及两次查阅码表。
    20          *    "中国"从字符数据变成字节数据的时候,会查阅gb2312码表。
    21          *    数据发送到浏览器端要显示的时候,需要再次查阅码表,这时查阅的码表与浏览器的设置有关。
    22          */
    24         }
    25 
    26     public void doPost(HttpServletRequest request, HttpServletResponse response)
    27             throws ServletException, IOException {
    28            doGet(request,response);
    29     }
    30 
    31 }

    浏览器编码设置为GB2312时的测试结果:


    浏览器编码设置为UTF-8时的测试结果:

      为了让我们的网站能被国外用户访问,我们在将字符数据变成字节数据时,要指定转换的码表为UTF-8。但这时如果浏览器以GB2312打开,又会出现乱码问题。虽然可以通过改变浏览器的设置来解决这个乱码问题,但不利于增强用户体验。因而我们需要用程序告诉浏览器查阅何种码表显示数据。

     1 package com.yyz.response;
     2 
     3 import java.io.IOException;
     4 import java.io.OutputStream;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 //输出中文的问题
    11 public class ResponseDemo extends HttpServlet {
    12 
    13     public void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         //在服务器端,数据是以哪个码表输出的,那么就要控制浏览器以哪个码表打开。
    16         String data = "中国";
    17         response.setHeader("content-type", "text/html;charset=UTF-8");
    18         OutputStream out = response.getOutputStream();
    19         out.write(data.getBytes("UTF-8"));
    20     }
    21 
    22     public void doPost(HttpServletRequest request, HttpServletResponse response)
    23             throws ServletException, IOException {
    24            doGet(request,response);
    25     }
    26 }

     多学一招:

    使用HTML语言里面的<meta>标签来控制浏览器行为。

    <meta http-equiv="Content-type'' content=''text/html;charset=UTF-8">
    http-equiv模拟了HTTP的响应头,告诉浏览器以UTF-8的码表打开。真正的响应头优先于用http-equiv模拟的响应头。

     实际开发中,服务器向浏览器写文本数据应该用字符流。但是通过response的getWriter方法拿到的字符流默认的码表是ISO8859-1,这张码表里是没有中文对应的编码的,因而会把?对应的编码发送给浏览器,浏览器打开后全是问号。通过response的setCharacterEncoding可以修改服务端发送数据时查阅的码表。

     1 package com.yyz.response;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 //输出中文的问题
    11 public class ResponseDemo extends HttpServlet {
    12 
    13     public void doGet(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         //在服务器端,数据是以哪个码表输出的,那么就要控制浏览器以哪个码表打开。
    16         String data = "中国";
    17         response.setHeader("content-type", "text/html;charset=UTF-8");
    18         response.setCharacterEncoding("UTF-8");
    19         PrintWriter out = response.getWriter();
    20         out.write(data);
    21     }
    22 
    23     public void doPost(HttpServletRequest request, HttpServletResponse response)
    24             throws ServletException, IOException {
    25            doGet(request,response);
    26     }
    27 }

    这里有几个小细节需要注意:
    1. response.setCharacterEncoding("UTF-8");需要写在PrintWriter out = response.getWriter();的前面。拿到字符流后再设置编码是没有用的。

    2. response.setHeader("content-type", "text/html;charset=UTF-8");有一种更为简单的写法response.setContentType("text/html;charset=UTF-8");。

    3.response.setContentType("text/html;charset=UTF-8");这句代码其实有两个作用:通知response以UTF-8输出和浏览器以UTF-8打开。即等价于response.setHeader("content-type", "text/html;charset=UTF-8");和response.setCharacterEncoding("UTF-8");两句代码。

    4.通过以上阅读,读者应该能明白为什么response.getOutputStream.write(1);这句代码在浏览器的输出不是1。因为浏览器是一个文本编辑器,收到数据后会拿着1去查码表,然后显示对应字符。想在浏览器输出数字,应该把数字变成字符串,response.getOutputStream.write((1+"").getBytes());.

  • 相关阅读:
    poj3718 Facer's Chocolate Dream
    codeforces 917D Stranger Trees
    uoj#349 【WC2018】即时战略
    bzoj5153 [Wc2018]州区划分
    bzoj5152 [Wc2018]通道
    loj2001[SDOI2017]树点染色
    loj2000[SDOI2017]数字表格
    Atcoder arc092
    bzoj4826[hnoi2017]影魔
    bzoj4827 [hnoi2017]礼物
  • 原文地址:https://www.cnblogs.com/yyz666/p/4045137.html
Copyright © 2011-2022 走看看