这篇文章主要介绍了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");

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

  1. HTML——ASP的 Response.write 方法输出中文乱码解决方案

    ASP的 Response.write方法输出的数据可能造成乱码问题 可以添加HTML的head标签限制页面的编码和限制ASP的编码解决 <!DOCTYPE html> <html ...

  2. 成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决)

    成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决) 目录 解决问题 解决思路 1.从网络读取图像数据并转换成图片格式 2.将图片 ...

  3. qt项目中的某一个类的输出中文信息乱码,其它类中文输出正常

    问题描述 qtcreate5.13.2中整个项目中通过添加头文件,使用qDebug()输出中文打印信息,输出中文都是正常的,但是有一个类的输出中文是乱码. 解决方法 修改该类的编码格式.由于项目默认采 ...

  4. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功

    mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功 登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroot -pabct ...

  5. 管理工具导入CSV文件,中文数据乱码的解决办法。

    瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:6.0 症状 管理工具的导入功能,使用CSV格式 ...

  6. 【50关于Visual Studio 2019控制台输出中文出现乱码问题及解决办法】

    文章目录 关于Visual Studio 2019控制台输出中文出现乱码问题及解决办法 1.从.txt文件中读取输出出现乱码 2.从中文字符串中读取输出出现乱码 关于Visual Studio 201 ...

  7. vs2012编程中输出中文出现乱码

    关于"vs2012编程中输出中文出现乱码"问题的探究 问题如下: //代码如下// #include<iostream> using namespace std; in ...

  8. Android studio编译日志输出中文出现乱码 (如apk为中文命名时候)解决

    Android studio编译日志输出中文出现乱码 (如apk为中文命名时候)解决 遇到乱码问题导致编译后 apk安装文件出错等 使用如下方法解决: 没有则点击**"create" ...

  9. 笨鸟先飞java代码,笨鸟先飞之Java--MySql中文数据乱码为哪般???

    图一:在drp的分销商模块,每次修改区域虽然返回修改成功,但是每次读取到的中文数据都是"???"的字符串,但数字和字母的数据却不受影响. 图二:不管是drp还是hibernate项 ...

最新文章

  1. Nginx+Lua(OpenResty) HelloWorld
  2. Leet Code OJ 237. Delete Node in a Linked List [Difficulty: Easy]
  3. scala的字符串的方法(五)
  4. Python中and、or、not用法
  5. php ftp 账号密码修改,月光软件站 - 编程文档 - 其他语言 - 用PHP即时添加,删除FTP帐号和更改FTP密码的函数...
  6. 企业级 SpringBoot 教程 (一)构建第一个SpringBoot工程
  7. 转:Java中abstract和interface的区别
  8. Java 标注(Annotation)详解
  9. 光电信息科学与工程学c语言吗,2019光电信息科学与工程专业怎么样、学什么、前景好吗...
  10. RTSP支持MPEG-4格式监控
  11. 【Freeswitch从入门到精通】二、初识Freeswitch
  12. CocosCreator接入穿山甲广告2-插屏广告
  13. gif制作软件哪个好用?建议收藏这些软件
  14. 项目过程管理(十八)集体加班制度
  15. VUE搭建云音乐播放器(App版本)
  16. 浏览器清理缓存快捷键
  17. KRFKKFFKKVKKSVKKRLKKIFKKPMVIGVTIPF-NH2|1818372-26-7
  18. 数据挖掘十大算法之 k-NN
  19. 【软件质量】软件健壮性
  20. 如何把静态图片做成动态图片?学会这一招让图片动起来

热门文章

  1. datatable中使用linq的条件或_C# 10. LINQ 的三种查询语句写法
  2. mongodb和mysql的对比_Mongodb与mysql语法比较
  3. JavaScript符号基础
  4. 使用动态SQL获取具有非空字段的自定义表结构
  5. Android 10如何增强移动安全性
  6. Chrome 将内置 QR 扫码共享页面功能
  7. 微软将不再把 .NET Framework API 移植到 .NET Core 3.0
  8. Visual Studio 2019 RC入门——第1部分
  9. 简单的动态JavaScript Ajax函数
  10. winexec函数 执行powershell 脚本_丢掉 Powershell.exe 来渗透测试