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向客户端输出中文数据乱码问题分析相关推荐
- HTML——ASP的 Response.write 方法输出中文乱码解决方案
ASP的 Response.write方法输出的数据可能造成乱码问题 可以添加HTML的head标签限制页面的编码和限制ASP的编码解决 <!DOCTYPE html> <html ...
- 成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决)
成功解决cv2.imwrite(filename, img)代码输出中文文件乱码的问题(cv2.imencode方法解决) 目录 解决问题 解决思路 1.从网络读取图像数据并转换成图片格式 2.将图片 ...
- qt项目中的某一个类的输出中文信息乱码,其它类中文输出正常
问题描述 qtcreate5.13.2中整个项目中通过添加头文件,使用qDebug()输出中文打印信息,输出中文都是正常的,但是有一个类的输出中文是乱码. 解决方法 修改该类的编码格式.由于项目默认采 ...
- mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功
mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功 登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroot -pabct ...
- 管理工具导入CSV文件,中文数据乱码的解决办法。
瀚高数据库 目录 环境 症状 问题原因 解决方案 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:6.0 症状 管理工具的导入功能,使用CSV格式 ...
- 【50关于Visual Studio 2019控制台输出中文出现乱码问题及解决办法】
文章目录 关于Visual Studio 2019控制台输出中文出现乱码问题及解决办法 1.从.txt文件中读取输出出现乱码 2.从中文字符串中读取输出出现乱码 关于Visual Studio 201 ...
- vs2012编程中输出中文出现乱码
关于"vs2012编程中输出中文出现乱码"问题的探究 问题如下: //代码如下// #include<iostream> using namespace std; in ...
- Android studio编译日志输出中文出现乱码 (如apk为中文命名时候)解决
Android studio编译日志输出中文出现乱码 (如apk为中文命名时候)解决 遇到乱码问题导致编译后 apk安装文件出错等 使用如下方法解决: 没有则点击**"create" ...
- 笨鸟先飞java代码,笨鸟先飞之Java--MySql中文数据乱码为哪般???
图一:在drp的分销商模块,每次修改区域虽然返回修改成功,但是每次读取到的中文数据都是"???"的字符串,但数字和字母的数据却不受影响. 图二:不管是drp还是hibernate项 ...
最新文章
- Nginx+Lua(OpenResty) HelloWorld
- Leet Code OJ 237. Delete Node in a Linked List [Difficulty: Easy]
- scala的字符串的方法(五)
- Python中and、or、not用法
- php ftp 账号密码修改,月光软件站 - 编程文档 - 其他语言 - 用PHP即时添加,删除FTP帐号和更改FTP密码的函数...
- 企业级 SpringBoot 教程 (一)构建第一个SpringBoot工程
- 转:Java中abstract和interface的区别
- Java 标注(Annotation)详解
- 光电信息科学与工程学c语言吗,2019光电信息科学与工程专业怎么样、学什么、前景好吗...
- RTSP支持MPEG-4格式监控
- 【Freeswitch从入门到精通】二、初识Freeswitch
- CocosCreator接入穿山甲广告2-插屏广告
- gif制作软件哪个好用?建议收藏这些软件
- 项目过程管理(十八)集体加班制度
- VUE搭建云音乐播放器(App版本)
- 浏览器清理缓存快捷键
- KRFKKFFKKVKKSVKKRLKKIFKKPMVIGVTIPF-NH2|1818372-26-7
- 数据挖掘十大算法之 k-NN
- 【软件质量】软件健壮性
- 如何把静态图片做成动态图片?学会这一招让图片动起来
热门文章
- datatable中使用linq的条件或_C# 10. LINQ 的三种查询语句写法
- mongodb和mysql的对比_Mongodb与mysql语法比较
- JavaScript符号基础
- 使用动态SQL获取具有非空字段的自定义表结构
- Android 10如何增强移动安全性
- Chrome 将内置 QR 扫码共享页面功能
- 微软将不再把 .NET Framework API 移植到 .NET Core 3.0
- Visual Studio 2019 RC入门——第1部分
- 简单的动态JavaScript Ajax函数
- winexec函数 执行powershell 脚本_丢掉 Powershell.exe 来渗透测试