请求响应编码

请求编码

 * 客户端发送的数据编码:由浏览器来决定:
  1). 如果是在地址栏中直接给出url,那么一般都是默认为GBK,但这个可能不太大。
  2). 如果是通过页面上的表单或超链接发出请求,那么由当前页面的编码来决定发送的参数的编码。

 * 无论浏览器发送过来的是什么编码的数据,Tomcat都默认使用ISO-8859-1来解码
  1). POST:可以使用request.setCharacterEncoding()方法来设置请求体数据的编码,
因为POST请求参数在请求体中,所以是可以设置编码的。在使用request.getParameter()方法获取参数之前,
先使用request.setCharacterEncoding()方法来设置编码即可。
  2). GET:没有方法可以设置它,因为参数在url中。所以使用request.getParameter()获取到的数据一定是
错误的使用了iso-8859-1解码的。可以再使用iso-8859-1把字符串转回到byte[],再重新使用正确的编码来解码即可。
  String s = request.getParameter("s");//使用iso-8859-1错误的解码了
  byte[] bytes = s.getBytes("iso-8859-1");//退回错误的解码,让字符串通过iso-8859-1返回到字节数据,即还原字节数据
  s = new String(bytes, "utf-8");//重新使用正确的utf-8来解码。

响应编码

* Tomcat响应数据默认使用ISO-8859-1
  * 通常浏览器默认使用GBK编码
  * response.setCharacterEncoding("utf-8");//设置response.getWriter()的字符编码

  1)
  response.getWriter().print("大家好");
  因为Tomcat默认使用的是ISO-8859-1编码,不支持中文。所以一定编码!

  2)
  response.setCharacterEncoding("utf-8");
  response.getWriter().print("大家好");
  因为已经设置了字符流编码为utf-8,所以响应给客户端的数据为utf-8编码!
  但因为浏览器默认使用的是gbk来解析响应数据,所以乱码!如果浏览器使用utf-8编码,那么就不会乱码了。

  3)
  response.setCharacterEncoding("gbk");
  response.getWriter().print("大家好");
  因为设置了字符流编码为gbk,所以响应给客户端的数据为gbk编码!
  因为浏览器默认使用gbk来解析数据,所以不会出现乱码!如果浏览器使用utf-8编码,那么就会出现乱码!

  4)
  response.setContentType("text/html;charset=utf-8");
  response.getWriter().print("大家好");
  setContentType()方法有两个作用:
  * 设置字符流编码。等同与调用了response.setCharacterEncoding("utf-8");
  * 设置Content-type响应头,即通知浏览器响应数据的编码为utf-8。
  因为设置字符流的编码为utf-8,所以响应给客户端数据为utf-8编码
  因为设置了Content-type头为utf-8,所以浏览器会使用utf-8来解析响应数据
  没有乱码!

  5)
  response.setContentType("text/html;charset=gbk");
  response.getWriter().print("大家好");
  * 设置了字符流为gbk,所以响应给客户端的数据为gbk
  * 设置了Content-type头为gbk,所以通知浏览器响应数据为gbk编码
  没有乱码!

  6)
  response.setHeader("Content-type", "text/html;charset=utf-8")
  等同于
  repsonse.setContentType("text/html;charset=utf-8")

  7)
  response.getOutputStream().write("大家好".getBytes("gbk"));
  响应的数据是gbk编码
  客户端浏览器默认使用gbk编码
  所以没有乱码

你可能感兴趣的:(java_web)