当前位置: 首页 > 编程笔记 >

JavaEE中用response向客户端输出中文数据乱码问题分析

百里芷阳
2023-03-14
本文向大家介绍JavaEE中用response向客户端输出中文数据乱码问题分析,包括了JavaEE中用response向客户端输出中文数据乱码问题分析的使用技巧和注意事项,需要的朋友参考一下

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


 package com.yyz.response;

 import java.io.IOException;

 import java.io.OutputStream;

 import javax.servlet.ServletException;

 import javax.servlet.http.HttpServlet;

 import javax.servlet.http.HttpServletRequest;

 import javax.servlet.http.HttpServletResponse;

 //输出中文的问题

 public class ResponseDemo extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response)

             throws ServletException, IOException {

         String data = "中国";

         OutputStream out = response.getOutputStream();

         out.write(data.getBytes());

         /**

          *     out.write(data.getBytes());这句代码涉及两次查阅码表。

          *    "中国"从字符数据变成字节数据的时候,会查阅gb2312码表。

          *    数据发送到浏览器端要显示的时候,需要再次查阅码表,这时查阅的码表与浏览器的设置有关。

          */

         }

     public void doPost(HttpServletRequest request, HttpServletResponse response)

             throws ServletException, IOException {

            doGet(request,response);

     }

 }

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

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

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


 package com.yyz.response;

 import java.io.IOException;

 import java.io.OutputStream;

 import javax.servlet.ServletException;

 import javax.servlet.http.HttpServlet;

 import javax.servlet.http.HttpServletRequest;

 import javax.servlet.http.HttpServletResponse;

 //输出中文的问题

 public class ResponseDemo extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response)

             throws ServletException, IOException {

         //在服务器端,数据是以哪个码表输出的,那么就要控制浏览器以哪个码表打开。

         String data = "中国";

         response.setHeader("content-type", "text/html;charset=UTF-8");

         OutputStream out = response.getOutputStream();

         out.write(data.getBytes("UTF-8"));

     }

     public void doPost(HttpServletRequest request, HttpServletResponse response)

             throws ServletException, IOException {

            doGet(request,response);

     }

 }

 多学一招:

使用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可以修改服务端发送数据时查阅的码表。


 package com.yyz.response;

 import java.io.IOException;

 import java.io.PrintWriter;

 import javax.servlet.ServletException;

 import javax.servlet.http.HttpServlet;

 import javax.servlet.http.HttpServletRequest;

 import javax.servlet.http.HttpServletResponse;

 //输出中文的问题

 public class ResponseDemo extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response)

             throws ServletException, IOException {

         //在服务器端,数据是以哪个码表输出的,那么就要控制浏览器以哪个码表打开。

         String data = "中国";

         response.setHeader("content-type", "text/html;charset=UTF-8");

         response.setCharacterEncoding("UTF-8");

         PrintWriter out = response.getWriter();

         out.write(data);

     }

     public void doPost(HttpServletRequest request, HttpServletResponse response)

             throws ServletException, IOException {

            doGet(request,response);

     }

 }

这里有几个小细节需要注意:
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());.

用OutputStream(字节流)发送数据:
1、response.getOutputStream().write(“中国”.getBytes());//以默认编码发送数据
2、response.getOutputStream().write("中国".getBytes("UTF-8"));//以UTF-8编码发送数据,浏览器(默认用GB2312)会出现乱码

解决办法:
2.1通过更改浏览器的编码方式:IE/”查看”/”编码”/”UTF-8”(不可取)
2.2通过设置响应头告知客户端编码方式:response.setHeader(“Content-type”, “text/html;charset=UTF-8”);//告知浏览器数据类型及编码
2.3通过meta标签模拟请求头:out.write("<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />".getBytes());
2.4通过以下方法:response.setContentType("text/html;charset=UTF-8");

 类似资料:
  • 本文向大家介绍详解mysql数据库中文乱码问题,包括了详解mysql数据库中文乱码问题的使用技巧和注意事项,需要的朋友参考一下 当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12','Sales',2000,'是个好员工!'); 出现乱码时,可以使用语句 

  • 本文向大家介绍Mac Mysql数据库中文乱码问题解决,包括了Mac Mysql数据库中文乱码问题解决的使用技巧和注意事项,需要的朋友参考一下 Mac 下MySQL数据库中文乱码解决方案: 当我们用框架进行数据库的存储操作时,经常会遇到中文乱码的问题。 如:在使用Java中得SSH框架时,我们需要在web.xml文件中配置编码的filter,具体代码是: 然后进行数据库存储的时候发现存储到数据库的

  • 本文向大家介绍PHP+MYSQL中文乱码问题,包括了PHP+MYSQL中文乱码问题的使用技巧和注意事项,需要的朋友参考一下 从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行. 解决这个问题其实很简单. 1.在建表的时候设置编码类型为gb2312_chinese_ci. 2.在PHP页面的数据库连接语句加一行mysql_query("SET NAMES

  • 本文向大家介绍SqlServer数据库中文乱码问题解决方法,包括了SqlServer数据库中文乱码问题解决方法的使用技巧和注意事项,需要的朋友参考一下 问题:创建新数据库,存入中文显示乱码??? 原因分析:SQL版的乱码问题还是出现在SQL SERVER的安装设置上。默认安装时系统默认的排序规则是拉丁文的排序规则,但一般人在安装时没有考虑到这一点,安装时只是点取下一步,安装完成后,造成了SQL版在

  • 本文向大家介绍AndroidStudio4.0日志中文乱码问题,包括了AndroidStudio4.0日志中文乱码问题的使用技巧和注意事项,需要的朋友参考一下 打开AndroidStudio安装目录,找到bin下这两个文件 最后一行添加 -Dfile.encoding=UTF-8 保存,重启,ok Android Studio 4.0 Run窗口中文乱码解决办法 解决方法: 依次打开菜单:Help

  • 本文向大家介绍关于servlet向mysql添加数据时中文乱码问题的解决,包括了关于servlet向mysql添加数据时中文乱码问题的解决的使用技巧和注意事项,需要的朋友参考一下 前言 最近写了一个小Demo,通过 servlet 向 mysql 中添加数据,在 dao 层使用的是 DBUtils 操作的数据库,可是在添加时偏偏出现了中文乱码问题,如下: 添加页面: 点击“添加商品”按钮后,出现中