java乱码本质是编码与解码不匹配,需统一源文件、编译、运行三处编码为utf-8,字符串与字节数组转换、io、数据库、web请求响应及终端日志均须显式指定utf-8编码。

确认字符编码是否一致
Java 乱码本质是“编码”和“解码”不匹配。常见场景:文件用 UTF-8 保存,但编译器或 IDE 按 GBK 读取;控制台输出 UTF-8 字符,但终端只支持 GBK。先检查三处编码是否统一:
- 源文件保存编码(IDE 设置里查,如 IntelliJ 的 File → File Encoding)
- 编译时编码(
javac -encoding UTF-8,Maven 需配project.build.sourceEncoding) - 运行时默认编码(
System.getProperty("file.encoding"),受 JVM 启动参数-Dfile.encoding=UTF-8影响)
字符串与字节数组转换要显式指定编码
避免使用无参构造或无参方法,它们依赖平台默认编码,极不稳定:
- 错:
new String(bytes)、str.getBytes() - 对:
new String(bytes, StandardCharsets.UTF_8)、str.getBytes(StandardCharsets.UTF_8) - Web 场景中,
HttpServletRequest的参数需提前调用request.setCharacterEncoding("UTF-8")(POST 表单),响应头也要设response.setContentType("text/html; charset=UTF-8")
IO 流和数据库连接要明确编码
文件读写、网络通信、数据库操作都可能隐式使用默认编码:
- 读文件:用
Files.readString(path, StandardCharsets.UTF_8)或InputStreamReader(in, StandardCharsets.UTF_8) - 写文件:用
Files.writeString(path, content, StandardCharsets.UTF_8)或OutputStreamWriter(out, StandardCharsets.UTF_8) - JDBC 连接 URL 加参数,如 MySQL:
?useUnicode=true&characterEncoding=UTF-8;PostgreSQL:?charset=UTF-8
终端与日志输出要看实际渲染环境
即使 Java 内部全用 UTF-8,终端/IDE 控制台也可能显示为方块或问号:
- Windows CMD 默认是 GBK,运行前执行
chcp 65001切到 UTF-8 - IDEA 控制台编码在 Settings → Editor → File Encodings → Console Encoding 单独设置
- Log4j / SLF4J 日志文件若乱码,检查
PatternLayout的charset属性是否设为UTF-8
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











