写在前面

对于一些老司机而言,其实并不太容易遇到乱码问题,但是对于一些新手来说,乱码几乎是家常便饭,而且每当乱码时,网上搜了一大堆解决方案,发现自己的问题还是没能解决,其实这就是平时研究代码不求甚解导致的,乱码问题,也要去分析,然后才能对症下药,才能药到病除

整体思路

首先出现乱码之后,要先去确认乱码的地方,当一个网页上出现乱码,有可能是浏览器显示问题,也有可能是 Java 编码问题,也有可能数据库中的数据本身就是乱码的,所以我们要做的第一件事就是确认乱码发生的位置,缩小 bug 范围,通过打印日志或者 debug 首先去确认乱码发生的位置,然后再去进一步解决

一般来说,乱码的原因大致上可以分为两类:

  1. 请求乱码:可能是因为参数放在 URL 地址中乱码,也有可能是参数放在请求体中乱码,不同传参方案也对应了不同的乱码解决方案
  2. 响应乱码:
  • 数据库本身乱码
  • 数据在 Java 代码中乱码
  • 数据在浏览器显示的时候乱码
  • 数据在从 Java 应用传到数据库的过程中乱码

基本原则

发生乱码是因为各自编码不同导致的,所以,大家首先要有一个良好的开发习惯,项目编码,文件编码都要统一起来

在Eclipse 中,设置项目编码方式如下(工程的编码要提前设置,如果项目已经开发一半再去设置,已有的中文就会乱码)

然后对于 JSP 文件也需要提前设置好编码方式,如下:

这是在 Eclipse 中设置文件编码,如果是在 IntelliJ IDEA中则不需要设置JSP文件编码,因为默认就是 UTF-8,只需要提前设置下工程编码即可

除了开发工具的编码,数据库的编码也要统一,一般来说,主要是设置一下数据库的编码和数据表的编码,如下

设置数据库编码

CREATE DATABASE `vhr` DEFAULT CHARACTER SET utf8;
复制代码

设置数据表编码

DROP TABLE IF EXISTS `adjustsalary`;
CREATE TABLE `adjustsalary` (`id` int(11) NOT NULL AUTO_INCREMENT,`eid` int(11) DEFAULT NULL,PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
复制代码

这些是准备工作,这些工作做好了,还是有可能会遇到乱码问题,接下来我们就具体问题具体分析。

请求乱码

请求乱码,就是说数据在浏览器中显示是正常的,但是传到 Java 后端之后,就乱码了,这种乱码一般来说,分为两种

1. URL 地址中的参数乱码

这种乱码主要发生在 GET 请求中,因为在 GET 请求中我们一般通过 URL 来传递参数,这个问题可以在代码中解决,但是太过于麻烦,因此一般我们直接在Tomcat配置中解决,修改 Tomcat的conf/server.xml 文件,修改 URL 编码格式,如下

2. 请求体中的参数乱码

请求体中的参数乱码,我们可以在解析参数之前通过设置 HttpServletRequest 的编码来解决,如下

request.setCharacterEncoding("UTF-8");
复制代码

但是一样也太过于麻烦,所以如果是普通的 Servlet/JSP 项目,我们就可以直接定义一个过滤器来处理,如下

public class EncodingFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("UTF-8");chain.doFilter(request, response);}
}
复制代码

过滤器配置

    <filter><filter-name>encodingFilter</filter-name><filter-class>org.sang.filter.EncodingFilter</filter-class></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
复制代码

响应乱码

如果在浏览器上加载页面看到了乱码,大家首先要确认在从服务端往浏览器写数据的前一刻,这个数据还没有乱码(即数据库中查询出来的数据是OK的,没有发生乱码的问题),那么对于这种乱码,我们只需要设置响应数据的 ContentType 就可以了

response.setContentType("text/html;charset=UTF-8");
复制代码

如果从数据库中查询出来的数据就是乱码的,那么就需要去确认数据库中的编码是否 OK

框架处理

前面提到的方案,都是在 Servlet/JSP 项目中我们可以采用的方案,在 SSM 框架中当然也可以使用,但是,SpringMVC 框架本身也提供了一个过滤器,我们可以借用这个过滤器更加高效的解决响应乱码问题,如下

<filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param>
</filter>
<filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
复制代码

当然,上面这段配置并不能代替 Tomcat 中 conf/server.xml 中的编码配置,如果是在 Spring Boot 中,配置可以更加简单,只需要在 application.properties 中添加如下配置即可

server.tomcat.uri-encoding=UTF-8
spring.http.encoding.force-request=true
spring.http.encoding.force-response=true
复制代码

其他乱码

其他乱码主要是指使用一些第三方框架导致的乱码,例如使用 Alibaba 的 fastjson,开发者就需要在配置 HttpMessageConverter 时指定编码格式,否则就有可能出现乱码

fastjson 的 HttpMessageConverter 配置如下:

@Bean
FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();config.setCharset(Charset.forName("UTF-8"));converter.setFastJsonConfig(config);converter.setDefaultCharset(Charset.forName("UTF-8"));return converter;
}
复制代码

一个隐蔽的乱码

除了前面介绍的这几种乱码之外,还有一个比较隐蔽的乱码,容易被很多初学者忽略的地方,就是数据在从 Java 应用传递到 MySQL 的过程中,发生了乱码,这种问题一般在 Windows 上不易发生,如果数据库装在 Linux 上,则这个问题就很容易发生

这种都是数据在 应用 和 数据库 之间传递时发生了乱码,解决方式很简单,在数据库连接地址上指定编码即可,如下

db.url=jdbc:mysql:///yuetong?useUnicode=true&characterEncoding=UTF-8
复制代码

转载于:https://juejin.im/post/5d0397f36fb9a07ede0b405c

还在为程序乱码烦恼?看看这篇文章吧,程序乱码大集合相关推荐

  1. 程序员看过这篇文章 让你学会阅读源码!

    摘要:随着越来越多的公司使用敏捷开发,能够阅读别人的代码比以往显得更重要.这就需要学习一些如何提高这项技能的技巧.本文提供了几种提高代码阅读技巧的方法. 在软件开发人员的职位描述中有阅读源代码.然而, ...

  2. 对存储还搞不清楚,先看看这篇文章-从51单片机上去理解存储器

    存储器是许多存储单元的集合,存储器单元实际上是时序逻辑电路(锁存器)的一种,按单元号顺序排列.每个单元由若干二进制位构成,以表示存储单元中存放的数值,这种结构和数组的结构非常相似.按存储器的使用类型可 ...

  3. 每个程序猿必读的10篇文章

    作为一名Java程序员和软件开发人员,那些每个程序员都应该知道的XXX的文章教会了我不少东西,它们提供了某个特定领域的一些实用的并且有深度的信息,这些东西通常很难找到.在我学习的过程中我读到过许多非常 ...

  4. 缺少微信小程序测试经验?这篇文章带你从0开始

    微信小程序已经越来越普遍,但目前接触小程序的项目相对较少,对小程序的特性也不了解,缺少小程序测试实战经验. 本文主要通过对微信小程序特性和测试点进行总结,储备测试知识,提高测试效率. 小程序发布审核 ...

  5. 全网分析HTTP协议最全的一篇文章,程序员赶紧收藏

    本篇文章篇幅比较长,先来个思维导图预览一下. 一张图带你看完本篇文章 一.概述 1.计算机网络体系结构分层 计算机网络体系结构分层 2.TCP/IP 通信传输流 利用 TCP/IP 协议族进行网络通信 ...

  6. 18年程序员退休后的第一篇文章:程序员推荐去的网站

    前言 大家伙,我是老龙,这是我的第一篇文章,写得不好还请大家多多见谅,我已经做了很多功课了,比如学习PS.新媒体这种之前当程序员就没怎么关心的东西,奈何年龄在此,但我会继续学习的. . 我到现在已经做 ...

  7. 程序员老鸟的一篇文章

    今天在网上闲逛的时候,看到了一个程序员老鸟写给新手们的一篇文章,个人觉得写得挺好的,就转了过来,分享给大家.正文如下: 展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走 ...

  8. Servlet还不会?那就看这篇文章吧

    一. Servlet是什么? Servlet是Server Applet的简称,也就是服务程序.当然,杨哥习惯称它为"服务连接器". 像上面这么说,大家可能会有所疑惑:什么是服务程 ...

  9. 面对就业我们是否还在徘徊那么你就看看这篇文章吧

    就业秘笈 面试第一个问题(谈谈你自己的情况如何?) 1.   报出自己的姓名和身份(其实面试官知道,只为礼貌) 2.   你可以简单地介绍一下你的学历.工作经历等基本个人情况 3.   如何去学习的过 ...

  10. 面对就业我们是否还在徘徊那么你就看看这篇文章把

                             就业秘笈 面试第一个问题(谈谈你自己的情况如何?) 1.   报出自己的姓名和身份(其实面试官知道,只为礼貌) 2.   你可以简单地介绍一下你的学历 ...

最新文章

  1. flask部署机器学习_如何开发端到端机器学习项目并使用Flask将其部署到Heroku
  2. 【我解C语言面试题系列】013 以单词为单位的翻转字符串
  3. php include传参数,浅谈php中include文件变量作用域
  4. Promise之异步调用
  5. docker小实战和应用
  6. 制作和unity调用动态链接库dll文件
  7. windows installer 3.2搞定
  8. hashMap 根据已有知识知道的
  9. 标准模板库(STL)之无序容器列传
  10. centos Linux 上 怎么命令行安装和卸载QQ
  11. 《人工智能:一种现代的方法》读书笔记之 智能Agent
  12. comsol 计算机配置,[转]我需要一台什么样的电脑运行我的COMSOL Multiphysics - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  13. 实用干货!因子分析超全步骤总结
  14. resin服务器部署项目,Resin服务器部署
  15. 优秀的程序员是如何利用工具来提升工作效率的?
  16. 树莓派系统备份与还原
  17. 通过HOST VIP连接Oracle数据库
  18. markdown编辑器推荐(附官网)
  19. pygame交换式拼图设计
  20. 成为腾讯开发者——如何使用QQ开放平台和微信开放平台

热门文章

  1. 2013-08-12 周报
  2. Arrays中的asList方法
  3. 排查jar包冲突的方法
  4. java单向链表按顺序插入节点
  5. acer s7 linux,清新脱俗深入骨髓!宏碁Aspire S7评测
  6. 我的世界java版双海底神殿种子_我的世界手机版海底神殿代码 0.16海底遗迹种子代码...
  7. IPv6即将来临,IPv6的信息安全?
  8. 博客的HTML代码如何运用,html代码运用(五)--常用特效解析
  9. HTML5实用知识点
  10. 服务器如何接收curl上传文件,linux curl上传文件到服务器