HttpServletResponse响应乱码问题分析

柯里薄雾
• 阅读 233

由于计算机中的数据是以二进制形式存储的,因此,当传输中文的时候,就会发生字符和字节之间的转换。当响应的数据是正文的时候,会发生编解码不一致的问题,在浏览器生会出现乱码的问题。

以下是响应乱码的分析以及两种解决方案:

一、乱码的演示

[Java] 纯文本查看 复制代码
?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //获取响应的字符流
    PrintWriter out = response.getWriter();

    //向浏览器响应:我是努力的小白
    out.print("我是努力的小白");
}

测试结果:???????

乱码产生的原因以及解决方案:

二、第一种解决方案
设置服务器的编码方式为GB2312,注意要在响应数据之前进行设置。

[Java] 纯文本查看 复制代码
?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//设置tomcat的编码方式为:GB2312
response.setCharacterEncoding("GB2312");
 
//获取响应的字符流
PrintWriter out = response.getWriter();

//向浏览器响应:我是努力的小白
out.print("我是努力的小白");

}

测试结果:
我是努力的小白

存在的问题:
通过浏览器的F12的查看响应的数据,依然是乱码:

小结:
这种解决方案作为了解,可以帮助我们更好的理解乱码产生的原因。

三、第二种解决方案
设置tomcat的编码为:UTF-8,浏览器的解码方式为:UTF-8

[Java] 纯文本查看 复制代码
?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//设置tomcat的编码方式为:UTF-8
response.setCharacterEncoding("UTF-8");

//设置浏览器的解码方式为:UTF-8
response.setHeader("Content-Type","text/html;charset=UTF-8");

//获取响应的字符流
PrintWriter out = response.getWriter();

//向浏览器响应:我是努力的小白
out.print("我是努力的小白");

}

测试结果:
我是努力的小白

查看浏览器响应数据:
通过浏览器的F12的查看响应的数据,不再是乱码:

上述方式写起来比较麻烦,可以简写为:
[Java] 纯文本查看 复制代码
?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    //设置tomcat的编码方式为:UTF-8

// response.setCharacterEncoding("UTF-8");

    //设置浏览器的解码方式为:UTF-8

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

    //相当于上述两行代码的简写
    response.setContentType("text/html;charset=UTF-8");

    //获取响应的字符流
    PrintWriter out = response.getWriter();

    //向浏览器响应:我是努力的小白
    out.print("我是努力的小白");
}

总结:
乱码产生的原因无非是两种原因:
一是:编码的方式不支持中文
二是:编解码不一致。
方案一作为了解,方案二的简写是我们在web阶段经常使用的解决响应乱码的一种方式。

点赞
收藏
评论区
推荐文章
linux服务器中安装mysql时候,远程访问的时候的乱码
今天部署皕杰报表,在linux服务器中安装mysql时候,远程访问的时候的插入中文数据会变成?,出现乱码问题。这就是编码不统一所导致的。解决方案:1.打开linux窗口,启动mysql:mysqlurootproot
Stella981 Stella981
3年前
Firefox浏览器设置字符编码格式
今天写博客,敲示例代码时遇到的问题。简单的HTML页面,在火狐浏览器出现中文乱码。如果是IE浏览器的话,直接通过菜单查看–编码就可以指定编码方式,解决乱码问题。现在Firefox浏览器版本升级太快,且展示方式也经常变化,本人还找了一番才找到火狐浏览器的设置字符编码的方式,在此分享出来,希望能帮到碰到这个问题的朋友。本人
Stella981 Stella981
3年前
Jenkins maven 构建乱码,修改file.encoding系统变量编码为UTF
一切都是windows的控制台默认编码GBK问题情景:使用jenkins构建,console输出的中文乱码。代码编码格式是utf8,因为Jenkins会默认读取当前系统的编码格式,导致构建日志乱码和selenium自动化测试输入的中文乱码。控制台输出乱码!(https://oscimg.oschina.net/oscnet/4
Wesley13 Wesley13
3年前
4种方法帮你解决IntelliJ IDEA控制台中文乱码问题
摘要:在本文中总结了4种方法完美解决IntelliJIDEA控制台中文乱码问题。前言IntelliJIDEA如果不进行配置的话,运行程序时控制台中文乱码问题会非常严重,严重影响我们对信息的获取和程序的跟踪。特总结以下4点用于解决控制台中文乱码问题,希望有助于大家。!(https://pic1.
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
UTF
  最近工作中需要将一些数据写入CSV文件中,并要使用Excel打开进行查看。测试时发现,导出的CSV文件用Excel打开后,中文字符全部是乱码。写入CSV文件的是UTF8编码的数据,文件在Linux中查看是没有问题的,在Windows上用Excel打开却有乱码。在查阅资料后发现,windows系统中文本文档的编码格式用BOM来指定,在文件的开头要写入字符
Stella981 Stella981
3年前
Beyond Compare编码
如何解决BeyondCompare中文乱码问题发布时间:20160309使用BeyondCompare比较一些含有中文的java或者jsp文件的时候,明明在项目里面是对的,可是用BeyondCompare打开之后就会出现乱码,而且看着一堆乱码还难受。那么该怎么解决GBK/UTF8等字符、
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
HTTP之请求响应中文乱码小结
1.response响应中文乱码(1)乱码原因:服务器的编码方式和浏览器的解码方式不一致导致解决方案:统一服务器和浏览器的编码解码方式,都使用utf8代码实现:response.setContentType("text/html;charsetutf8");2.request请求中文乱码(1)post请求乱码  
Stella981 Stella981
3年前
GET请求传递中文参数出现乱码问题(适用于Tomcat服务器)
   中文参数乱码的问题,归根到底就是编码与解码时格式不一致导致的。要解决这类问题,首先就得分析前台传参是以什么格式对请求进行编码的,后台再以相应的格式进行解码就可以了。    Tomcat的默认编码是ISO88591,当Tomcat收到GET请求时,它会使用ISO88591对请求进行编码,因此Java后台在接收这些中
Stella981 Stella981
3年前
Servlet程序乱码解决方案
Servlet程序乱码解决方案乱码经常出现在什么位置数据保存过程中的乱码数据展示过程中的乱码数据传递过程中的乱码数据保存过程中的乱码数据保存到数据库表中的时候,数据出现乱码导致数据保存过程中的乱码包括以下两种情况: