核心是编码链路断裂:jvm默认用gbk输出字节,而ide或终端按utf-8解码,导致“浣犲ソ”等乱码;解决关键是统一为utf-8,推荐在main开头用system.setout(new printstream(system.out, true, standardcharsets.utf_8))强制重置输出编码。

控制台输出中文乱码,核心是“编码链路断了”:Java 输出字节时用的编码,和终端(IDE 控制台)解码时用的编码不一致。Windows 上最常见的是 JVM 默认用 GBK 编码输出,而 IDEA、VSCode 或 Windows 终端默认按 UTF-8 解码,结果字节被错读,就变成“浣犲ソ”“???”这类乱码。解决的关键不是盲目改一堆配置,而是让“输出编码”和“解码预期”对齐——最稳的方式是统一走 UTF-8,并从源头控制。
确认当前 file.encoding 是什么
先别急着改设置,跑一行代码看 JVM 实际用的编码:
System.out.println(System.getProperty("file.encoding"));
在 Windows 中,这个值通常是 GBK(或 Cp936),不是 UTF-8。这就是乱码的起点——System.out 默认按这个编码把字符串转成字节。
代码级强制统一输出编码(推荐,一劳永逸)
绕开 IDE 和 Tomcat 配置,直接在程序启动时重置输出流的编码逻辑:
- 在 main 方法开头加这三行:
System.setOut(new PrintStream(System.out, true, StandardCharsets.UTF_8));
System.setErr(new PrintStream(System.err, true, StandardCharsets.UTF_8));
System.setProperty("file.encoding", "UTF-8");
这样 System.out.println("你好") 就会以 UTF-8 字节写出,无论 IDEA 控制台、VSCode 终端还是 Windows CMD(只要它支持 UTF-8 渲染),都能正确解码。
注意:JDK 8+ 支持 StandardCharsets.UTF_8;若用老版本,可换成 "UTF-8" 字符串参数。
配套确保源文件和编译器也用 UTF-8
光改输出还不够——如果 .java 源文件本身是 GBK 编码,而 javac 却按 UTF-8 读,编译出来的 class 里字符串字面量就是错的,后面怎么输出都白搭。
- 在 IDE 中检查并保存源文件为 UTF-8(无 BOM)
- 强制 javac 使用 UTF-8 编译:
– IDEA:Settings → Build → Compiler → Java Compiler → “Default encoding for properties files” 设为 UTF-8
– VSCode:在 settings.json 中加 "java.configuration.compilerArgs": ["-encoding", "UTF-8"] - Maven 项目需声明:
UTF-8
终端/IDE 控制台渲染层也要配合
即使 Java 输出了正确的 UTF-8 字节,如果终端本身不按 UTF-8 解码,还是乱码。
- IDEA:Settings → Editor → File Encodings → “Project Encoding” 和 “Default encoding for properties files” 都设为 UTF-8;勾选 “Transparent native-to-ascii conversion”(避免中文转义)
- VSCode:确保 "files.encoding" 和 "[java]".files.encoding 都是 utf8,并设置终端环境变量:
"terminal.integrated.env.windows": { "JAVA_TOOL_OPTIONS": "-Dfile.encoding=UTF-8" } - 纯 CMD/PowerShell:运行 chcp 65001 切换到 UTF-8 代码页(临时),或通过系统环境变量永久设置 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











