实用干货!Java乱码问题原因及解决方案大全

最近有粉丝给壹哥发来私信,问我Java里的乱码问题该怎么解决,说是自己被乱码问题给弄的焦头烂额,不知道该咋办了。

其实乱码问题解决起来很简单,很多人搞不定乱码是由于没有找到导致乱码的根本原因!

试想,如果你都找不到导致乱码的根本原因,就去网上一通百度查找,即使网上的内容讲得头头是道,但最后还是不能解决你自己的问题。于是你就得出结论,网上的文章都是垃圾........其实,这是因为你自己没找到问题产生的根源,你没有对症下药啊大兄弟!

对于一些有经验的开发者来说,想遇到乱码还真不容易,但对于一些新手来说,乱码几乎是家常便饭!所以千锋壹哥今天就带大家把这个新手常见的经典问题给你彻底搞定,让乱码问题以后躲着你走!

一. 乱码问题解决思路

首先我们要找到导致乱码的根本原因,分析到底是哪种情况导致了乱码,壹哥给大家总结了几种常见的可能导致乱码的原因,我们一起来看看:

接下来壹哥就把上述几种情况分别讨论分析一下。

1. 请求乱码

如果是在请求过程中发生的乱码,有可能是以下几种情况:

  • 参数在 URL 地址中乱码;
  • 参数在请求体中乱码;
  • 数据库本身乱码;
  • 数据从 Java 应用程序传入数据库的过程中乱码。

2. 响应乱码

如果是响应乱码,那么原因就会更多一些,一般来说,有如下几种可能:

  • 数据库本身乱码;
  • 数据在Java 代码中乱码;
  • 数据在浏览器显示时乱码;
  • 数据在从 Java 应用传到数据库的过程中乱码。

不同原因导致的乱码,就会有不同的解决方案,对症下药,才能药到病除!所以你从网上找到的答案,未必就符合你的乱码原因!

分析完以上这些可能会导致乱码的原因之后,接下来大家要做的,就是通过 DEBUG 或者打印日志来锁定导致自己乱码的原因。看看自己的乱码到底是属于哪一种,找到了乱码的原因,问题就解决了 80%!

接下来千锋壹哥针对上面每种不同的原因,给出不同的解决方案。

二. 具体解决方案

1. 解决URL地址乱码

如果我们把中文的请求参数放到了URL地址栏中,结果出现了乱码,这个问题在GET、DELETE等请求中是比较常见的,而解决方案也很简单,我们只需要修改 Tomcat的 conf/server.xml 配置文件,修改 URL编码格式,如下:

这样就可以一劳永逸地解决 URL地址乱码问题了!可能有人会问,这不是解决 GET请求乱码的吗?其实这个说法不准确,凡是URL地址乱码,都可以这样解决,无论是 GET、POST、PUT,还是 DELETE 请求。

另外我们知道,Spring Boot 中的 Tomcat 是内嵌的,这该怎么办呢?如果是在 Spring Boot 中,其实配置更加简单,我们只需要在 application.properties 配置文件中添加如下配置即可:

server.tomcat.uri-encoding=UTF-8
spring.http.encoding.force-request=true
spring.http.encoding.force-response=true

2. 解决请求体乱码

对于 POST、PUT 等请求,请求参数一般是放在请求体中的,此时如果发生乱码,我们可以在解析参数之前通过设置 HttpServletRequest 编码来解决,如下:

request.setCharacterEncoding("UTF-8");

不过如果每次都这样设置,就太麻烦了,所以我们可以自定义一个过滤器来解决,如下:

/**
 * 千锋Java
 * @author 一一哥Sun
 */
public class EncodingFilter implements Filter {
    @Override
    public 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>com.qfedu.filter.EncodingFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

在传统的Java Web项目中,我们一般是按上述方法解决乱码问题的。但如果是在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>

当然,现在流行的SpringBoot,根本都不用配置 XML文件了,但我们同样可以使用 Java 代码的形式在 Spring Boot 中配置上面的过滤器!

3. 解决数据库乱码

对于数据库中的乱码问题,我们只需要打开 SQLYog 或者 Navicat,就可以确定是不是数据库乱码了。其实数据库乱码是很容易解决的,一般只需要在创建库和表的时候,分别指定编码格式即可,如下:

3.1 设置数据库编码

CREATE DATABASE `vhr` DEFAULT CHARACTER SET utf8;

如果你使用的是 SQLYog,创建数据库时记得设置编码格式:

如果你使用的是 Navicat,可以类似如下:

3.2 设置数据表编码

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

如果是使用 SQLYog 或者 Navicat创建的表,我们在创建时也记得勾选一下编码格式即可。

4. 解决传输乱码

数据在从 Java 应用传递到 MySQL,或者从 MySQL 传递到 Java 代码的过程中,也有可能会发生乱码!这种问题在 Windows 上一般不易发生,但如果你的数据库是安装在了 Linux 上,这就是一个大概率的问题了。具体表现形式有两种:

  1. 数据在 Java 代码中打印是正常的,结果一存到数据库中就乱码了;
  2. 数据在数据库中是正常的,结果读取到 Java 代码中一打印就乱码了。

这种问题发生在传输过程中,具体解决办法如下,修改 JDBC 连接即可,加上编码格式:

jdbc:mysql:///baize?useUnicode=true&characterEncoding=UTF-8

壹哥以上提出的四种方案,就可以分别解决上面四种不同的乱码情况,现在你会了吗?

5. 解决其他乱码

除了以上几种会导致乱码的情况之外,项目中可能还有其他导致乱码的原因,接下来壹哥会给大家继续分析。

5.1 解决JSON 乱码

如果你在项目中用到了号称最快的 Alibaba fastjson,那么你需要在配置 HttpMessageConverter 时就得指定编码格式,否则就有可能出现乱码,配置如下:

/**
 * 千锋Java
 * @author 一一哥Sun
 */
@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;
}

5.2 解决Properties文件乱码

有时候我们在项目中使用了 properties 格式的配置文件,这也有可能会导致乱码。不过现在的 IntelliJ IDEA 中,已经有现成的解决方案了,我们只需要稍微配置一下即可。点击 File->Settings->Editor->File Encodings,然后进行配置,如下:

三. 养成优秀的编码习惯

我们开发时遇到的各种乱码问题,其实都是可以预防的,只要大家养成优秀的编码习惯即可。

1. 统一编码格式

还有一些乱码问题,完全是因为个人的编码习惯不好导致的,所以各位小伙伴要养成一个良好的编码习惯。

对于开发来说,我们的项目编码、文件编码的格式都必须统一起来。壹哥曾经有个同事就因为 Freemarker乱码,找了半天没找到原因,后来在壹哥的建议下修改了项目编码,乱码问题才得以解决。

2. Eclipse中设置编码格式

另外大家在公司中 Coding时,只要公司制度稍微成熟一些,都会对项目编码、文件编码等有着硬性的规定。比如在Eclipse 中,我们设置项目编码的方式如下(工程的编码要提前设置,如果项目已经开发一半再去设置,已有的中文就会乱码):Window->Preferences->General

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

这是在 Eclipse 中设置文件编码的方式。

3. IDEA中设置编码格式

我们现在其实已经很少使用 Eclipse了,更多的是使用 IDEA。所以如果你是在 IntelliJ IDEA中进行编程,则不需要设置JSP文件编码,因为默认的就是 UTF-8,非常方便省事。在 IntelliJ IDEA 中,我们只需要提前设置下工程编码即可:

四. 结语

至此,壹哥就把导致乱码的几个常见原因都给大家总结梳理了一遍,并讲解了对应的解决方案和良好的开发习惯。如果以上这些方案还不能解决你的乱码问题,欢迎在评论区留言,壹哥亲自给你解决!

  • 22
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一一哥Sun

您的鼓励是我继续创作的动力哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值