java中文乱码本质是编码链路断裂,需统一源文件、javac编译、jvm运行、终端解码四环节为utf-8:1.源文件以utf-8保存;2.javac加-encoding utf-8;3.jvm启动加-dfile.encoding=utf-8;4.终端设为utf-8(如windows执行chcp 65001)。

Java 中出现中文乱码,不是“显示坏了”,而是字符在某一个环节被错误解读了。核心就四件事:源文件怎么存的、编译器怎么读的、JVM 怎么运行的、终端怎么解的。只要其中一环编码不一致,中文就会变成问号、方块或一堆奇怪符号。
检查源文件保存编码
这是第一道关卡。Java 源码是文本,编辑器怎么存,javac 就怎么读——如果用记事本默认 ANSI(GBK)保存,而 IDE 默认按 UTF-8 解析,字符串字面量里的中文从编译那一刻起就错了。
- VS Code 右下角点击编码标识(如“UTF-8”或“GBK”),选“以 UTF-8 保存”
- Notepad++ 点“编码 → 转为 UTF-8 无 BOM 格式”,再保存
- 确认后可临时加一行测试:System.out.println("✓");,看编译是否报错或输出异常
确认 javac 编译时指定了编码
即使源文件是 UTF-8,javac 也可能按系统默认编码(Windows 常为 GBK)去解析它。尤其在命令行手动编译时,这步极易遗漏。
- 编译命令必须带 -encoding UTF-8: javac -encoding UTF-8 Hello.java
- Maven 项目需在 pom.xml 中声明:
UTF-8 - IDE(如 IntelliJ)也要检查设置:File → Settings → Editor → File Encodings → Project Encoding 设为 UTF-8
确保 JVM 运行时使用 UTF-8
.class 文件本身不含编码信息,但 System.out 的底层输出流会继承 JVM 启动时的默认字符集。没指定的话,它可能沿用系统 locale(比如 CentOS 默认 en_US.UTF-8,但某些 Docker 镜像或旧服务器是 C 或 POSIX)。
- 运行命令加参数:java -Dfile.encoding=UTF-8 Hello
- 验证当前默认编码:System.getProperty("file.encoding") 或 Charset.defaultCharset()
- Spring Boot 应用可在 application.properties 加:
server.tomcat.uri-encoding=UTF-8
spring.http.encoding.charset=UTF-8
终端/控制台必须支持并启用 UTF-8 解码
JVM 输出的是字节流,终端负责把它“翻译”成文字。如果终端用 GBK 解 UTF-8 字节,必然乱码。这不是 Java 的问题,是终端环境配置问题。
- Windows CMD:运行 chcp 65001 切换代码页为 UTF-8;右键标题栏 → 属性 → 字体 → 选 Consolas 或 Lucida Console
- Windows Terminal / PowerShell:默认已支持 UTF-8,检查设置中 “Default profile → Unicode support” 是否开启
- macOS / Linux:确保 locale 输出含 UTF-8(如 en_US.UTF-8);若为 C 或 POSIX,需执行 export LANG=en_US.UTF-8
- VS Code 内置终端:它本身不决定编码,取决于你配置的 shell 和系统 locale,不是改 VS Code 字体就能解决的
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











