问题现象
在 IDEA 中启动 Spring Boot 项目时,控制台输出的中文日志全部变成乱码:
2026-05-10 13:42:17 [] [restartedMain] INFO c.j.f.common.filter.XssFilter - XSS杩囨护鍣ㄥ垵濮嬪寲瀹屾垚
明明项目配置的编码是 UTF-8,IDEA 的设置也是 UTF-8,为什么运行时还会乱码?
问题根源
这个问题和 JDK 18+ Maven 编译乱码 的根源相同:
从 JDK 18 开始,Java 官方修改了控制台输出的默认编码行为。System.out 和 System.err 的编码不再跟随系统区域设置,而是默认使用 UTF-8。但 IDEA 的 Spring Boot 启动配置没有显式设置 -Dstdout.encoding 和 -Dstderr.encoding,导致编码协商不一致。
与 Maven 编译乱码不同的是,Spring Boot 控制台乱码发生在应用运行时,而不是编译时。因此需要在运行配置中设置 VM Options。
方案 1:修改全局默认运行配置(强烈推荐)
这是 IDEA 新版本推荐的全局配置方式,一次设置,所有新项目自动生效。
操作步骤
- 点击 IDEA 右上角运行配置下拉框 → 选择 Edit Configurations...
- 在弹出的窗口左侧,找到并展开 Edit configuration templates...(在最底部)
- 在模板列表中找到 Application(Spring Boot 启动用的就是这个模板)
- 在右侧的 VM Options 输入框中粘贴这三个参数:
-Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 - 同样地,找到 Maven 模板,也把这三个参数粘贴进去
- 点击 Apply → OK
- 删除你现有的 Spring Boot 启动配置,重新生成一个(重要!旧配置不会继承新模板)
✅ 这样设置后,所有以后新建的 Spring Boot 项目、所有 Maven 命令都会自动继承这个配置,再也不会有乱码问题。
方案 2:针对单个 Spring Boot 项目临时解决
如果不想改全局配置,只改当前项目:
操作步骤
- 点击 IDEA 右上角运行配置下拉框 → Edit Configurations...
- 找到你的 Spring Boot 启动配置(就是那个带绿色叶子图标的)
- 在 VM Options 输入框中添加同样的三个参数:
-Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 - 点击 Apply → OK
- 重新启动 Spring Boot 应用
方案 3:终极兜底方案(永远有效)
如果上面的方法还是有问题,直接修改 IDEA 本身的全局 VM Options 文件,这个方法在任何 IDEA 版本都不会变。
操作步骤
- 找到你的 IDEA 安装目录:
D:\soft\devtool\green\idea-2026.1.win\bin - 打开
idea64.exe.vmoptions文件(注意是 64 位的那个,不要打开 32 位的) - 在文件末尾添加这三行:
-Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 - 保存文件
- 完全退出 IDEA,然后重新启动(必须完全退出,不能只是关闭窗口)
✅ 重启后,所有在 IDEA 中运行的 Java 进程(包括 Spring Boot、Maven、JUnit 等)都会自动使用 UTF-8 编码。
三种方案对比
| 方案 | 作用范围 | 持久性 | 推荐度 |
|---|---|---|---|
| 方案 1:全局模板配置 | 所有新建项目 | 永久生效 | ⭐⭐⭐⭐⭐ |
| 方案 2:单个项目配置 | 仅当前项目 | 当前项目有效 | ⭐⭐⭐ |
| 方案 3:修改 vmoptions | 所有 IDEA 内 Java 进程 | 永久生效 | ⭐⭐⭐⭐ |
验证方法
配置完成后,重新启动 Spring Boot 应用,观察控制台输出:
2026-05-10 13:42:17 [] [restartedMain] INFO c.j.f.common.filter.XssFilter - XSS过滤器初始化完成
中文正常显示,乱码问题解决!
总结
Spring Boot 控制台中文乱码的根本原因是 JDK 18+ 修改了控制台编码默认行为。解决方案和 Maven 编译乱码一样,核心都是配置三个参数:
-Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8
区别在于:
- Maven 编译乱码 → 在 Maven Runner 的 VM Options 中配置
- Spring Boot 运行乱码 → 在 Application 运行配置的 VM Options 中配置
最佳实践:直接使用方案 1 修改全局模板配置,一次设置,所有项目终身受益。