Java项目中文乱码源于源文件读取、编译、JVM运行、IDE显示、构建工具五环节编码不统一;需统一设为UTF-8:源码保存为UTF-8无BOM,IDE全局/项目编码设UTF-8,javac加-encoding UTF-8,JVM启动加-Dfile.encoding=UTF-8,构建部署环境同步配置。

Java项目中编码格式配置不当,容易导致中文乱码、编译失败或运行时字符串异常。核心问题不在代码本身,而在于源文件读取、编译器解析、JVM运行、IDE显示、构建工具处理这五个环节的字符集是否统一。默认情况下,JDK 17+ 使用UTF-8,但旧版本(如JDK 8)默认用系统编码(Windows常为GBK),极易出问题。
确保源码文件保存为UTF-8
这是起点。无论IDE如何设置,源文件物理编码必须是UTF-8:
- 在IntelliJ IDEA中:File → Settings → Editor → File Encodings → Global Encoding / Project Encoding / Default encoding for properties files → 全部设为UTF-8;勾选“Transparent native-to-ascii conversion”(对properties文件必要)
- 在Eclipse中:Window → Preferences → General → Workspace → Text file encoding → UTF-8;再进入Java → Compiler → Encoding → 设为UTF-8
- 用记事本或VS Code编辑时,务必手动选择“另存为UTF-8无BOM格式”
显式指定javac编译编码
即使源码是UTF-8,javac仍可能按系统默认编码读取——尤其在命令行编译时:
- 命令行编译:加参数 -encoding UTF-8,例如:
javac -encoding UTF-8 Main.java - Maven项目:在
pom.xml中配置maven-compiler-plugin:
org.apache.maven.plugins maven-compiler-plugin 3.11.0 17 17 UTF-8
JVM运行时字符集控制
程序运行阶段,InputStreamReader、Scanner、Files.readString()等API依赖默认字符集,而该默认值由JVM启动时决定:
立即学习“Java免费学习笔记(深入)”;
- 推荐方式:启动JVM时强制指定 -Dfile.encoding=UTF-8,例如:
java -Dfile.encoding=UTF-8 MyApp - 验证当前默认编码:运行
System.out.println(Charset.defaultCharset()); - 避免依赖默认值:读写文件时显式传入Charset,如
Files.readAllLines(path, StandardCharsets.UTF_8)
构建与部署环境一致性
本地正常 ≠ 服务器正常。Linux服务器LANG常为en_US.UTF-8,但若脚本未声明或容器未配置,仍可能降级:
- Maven打包时,确保
MAVEN_OPTS含 -Dfile.encoding=UTF-8 - Docker镜像中,在Dockerfile添加:
ENV LANG=C.UTF-8或ENV JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 - Spring Boot应用可在
application.properties中加:server.servlet.encoding.charset=UTF-8和server.servlet.encoding.enabled=true(仅影响HTTP请求体解码)










