Java统一编码需从源码编写、IDE配置、编译运行、文件读写四层面同步设为UTF-8,缺一不可;IDE须设Global/Project/Properties三层编码,编译需Maven或javac显式指定UTF-8,IO流必须显式传"UTF-8"参数。

Java 中统一编码格式,关键不是“改一次就万事大吉”,而是从源码编写、IDE配置、编译运行、文件读写四个层面同步控制,缺一不可。只调一个地方,其他环节不匹配,照样乱码。
IDE 全局与项目级编码必须一致
IntelliJ IDEA(或 Eclipse、STS)有三层编码设置:全局默认、项目级别、单个文件级别,优先级由低到高。只改 Project Encoding 是无效的。
- 打开 Settings > Editor > File Encodings
- 三项全部设为 UTF-8:
- Global Encoding(全局)
- Project Encoding(项目)
- Default encoding for properties files(.properties 文件专用,否则中文注释变问号)
- 右下角状态栏若显示 GBK 或 ISO-8859-1,点击它 → 选 UTF-8 → 勾选 Convert(否则只是界面切换,内容未重解码)
编译环节强制指定 UTF-8
Maven 或 javac 默认可能用系统编码读源码,Windows 尤其危险(默认 GBK),必须显式声明。
- Maven 项目:在 pom.xml 的
中添加:UTF-8 - 命令行编译:不用依赖环境变量,直接加参数:
javac -encoding UTF-8 MyClass.java - IDE 运行配置:在 Run > Edit Configurations > VM options 中添加:
-Dfile.encoding=UTF-8
代码中字符流必须显式传编码名
跨平台文件读写时,绝不能依赖系统默认编码。OutputStreamWriter / InputStreamReader 构造时必须传字符串 "UTF-8"。
- ✅ 正确写法:
new OutputStreamWriter(new FileOutputStream("log.txt"), "UTF-8") - ❌ 错误写法(平台相关,Windows 下极易乱码):
new OutputStreamWriter(new FileOutputStream("log.txt")) - 读取端也必须严格对应:
new InputStreamReader(new FileInputStream("log.txt"), "UTF-8") - 推荐组合缓冲提升健壮性:
new BufferedWriter(new OutputStreamWriter(out, "UTF-8")),并用 try-with-resources 自动 close
配套细节不能漏
常见“已设 UTF-8 却还乱码”的原因,往往出在这些边缘环节:
-
.properties 文件:Java 传统要求 ISO-8859-1 编码,但现代 IDE 支持 UTF-8 + Unicode 转义(如
\u4f60\u597d)。更稳妥的是用ResourceBundle.getBundle()或 Spring 的ReloadableResourceBundleMessageSource,它们能自动识别 UTF-8 -
数据库连接:JDBC URL 加上
?characterEncoding=UTF-8&useUnicode=true(MySQL) -
Web 容器(如 Tomcat):server.xml 的 Connector 标签加
URIEncoding="UTF-8",解决 GET 请求中文参数乱码 -
JSP 页面:顶部声明
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











