Java中文乱码核心是编码与解码字符集不一致,需全程统一为UTF-8:检查源文件真实编码(避免ANSI/BOM)、编译运行时指定-Dfile.encoding=UTF-8、终端切换UTF-8代码页、IO及网络交互显式声明StandardCharsets.UTF_8。

Java 中字符编码乱码问题,核心在于“编码”与“解码”环节不一致。只要逐层确认每个环节使用的字符集是否统一为 UTF-8(推荐标准),就能快速定位并解决。
一、检查源文件实际保存编码
IDE 或编辑器显示“UTF-8”不代表文件真是 UTF-8 编码——尤其 Windows 记事本默认用 ANSI(即 GBK)保存中文,容易埋下隐患。
- 用 Notepad++ 打开 .java 文件,点击顶部菜单「编码」→ 查看当前是「UTF-8 无 BOM」还是「ANSI」;若为 ANSI,选「转为 UTF-8 无 BOM 格式」并保存
- VS Code 右下角显示编码,点击后选「Save with Encoding」→「UTF-8」
- 避免使用带 BOM 的 UTF-8:BOM(\uFEFF)可能干扰 Java 编译器识别,导致编译报错或字符串开头异常
二、统一编译与运行时 JVM 编码
即使源码是 UTF-8,若 javac 或 java 命令未明确指定编码,就会 fallback 到系统默认值(Windows 是 GBK,Linux/macOS 通常是 UTF-8),造成跨平台乱码。
- 编译时强制指定:javac -encoding UTF-8 PackageTest01.java
- 运行时设置系统属性:java -Dfile.encoding=UTF-8 PackageTest01
- Maven 项目需在 pom.xml 中声明:<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
三、验证终端/控制台能否正确显示 UTF-8
程序输出没错,但 cmd、PowerShell 或 Linux 终端字体不支持或代码页非 UTF-8,照样显示“”或“锟斤拷”。
立即学习“Java免费学习笔记(深入)”;
- Windows 命令行执行:chcp 65001(切换为 UTF-8 代码页)
- 右键标题栏 →「属性」→「字体」选项卡 → 改为 Consolas 或 Lucida Console(支持 Unicode)
- Linux/macOS 检查 locale:运行 locale | grep UTF,确保 LANG=en_US.UTF-8 类似值生效
四、文件 IO 和网络交互中显式指定编码
Java 的 FileWriter / FileReader 默认用系统编码,极易出错;HTTP、数据库等外部交互更需主动声明 charset。
- 读写文本文件时,不用 FileWriter,改用:
- new InputStreamReader(new FileInputStream("a.txt"), StandardCharsets.UTF_8)
- new OutputStreamWriter(new FileOutputStream("b.txt"), StandardCharsets.UTF_8)
- Servlet 中处理请求参数前必须调用:request.setCharacterEncoding("UTF-8")(且要在 getParameter() 之前)
- JDBC 连接 MySQL 时 URL 加参数:?useUnicode=true&characterEncoding=UTF-8


















