Java字符编码问题本质是编码与解码规则不匹配,如UTF-8写入却用GBK读取;解决关键是全程统一UTF-8并显式指定,避免依赖平台默认编码,覆盖文件IO、JDBC、HTTP、开发环境等全链路。

文件读写必须显式指定编码
Java 的FileReader 和 FileWriter 会偷偷用系统默认编码(Windows 是 GBK,Linux/macOS 是 UTF-8),这是最隐蔽的乱码源头。
正确做法是绕过它们,用字节流 + 指定编码的字符流组合:
✅ 正确示例(读):
try (InputStreamReader isr = new InputStreamReader(
new FileInputStream("data.txt"), StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(isr)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // 中文正常显示
}
}
✅ 正确示例(写):
try (OutputStreamWriter osw = new OutputStreamWriter(
new FileOutputStream("out.txt"), StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(osw)) {
writer.write("你好,세상!");
}
⚠️ 避免:new FileReader("file.txt") 或 new FileWriter("file.txt") —— 它们不接受编码参数,风险极高。
JDBC 连接必须带编码参数
MySQL、PostgreSQL 等数据库即使本身设为 utf8mb4,如果 JDBC 连接没声明编码,驱动仍可能按 latin1 或平台默认处理。✅ MySQL 连接 URL 示例:
立即学习“Java免费学习笔记(深入)”;
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
✅ PostgreSQL 示例:
jdbc:postgresql://localhost:5432/mydb?charset=utf8
? 补充:Hibernate/JPA 用户需在 application.properties 中同步配置:
spring.jpa.properties.hibernate.connection.characterEncoding=UTF-8 spring.jpa.properties.hibernate.connection.useUnicode=true
HTTP 请求与响应要声明 charset
前后端交互时,中文乱码常出现在 JSON 或表单提交中,根源是 HTTP 头缺失或不一致。✅ Spring Boot Controller 返回 JSON(自动生效):
@GetMapping("/api/data")
public ResponseEntity<String> getData() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8); // 显式带 UTF-8
return new ResponseEntity<>("{\"msg\":\"成功\"}", headers, HttpStatus.OK);
}
✅ Servlet 中设置响应头:
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
✅ 前端发起请求时也应指定:
fetch("/api/save", {
method: "POST",
headers: { "Content-Type": "application/json; charset=utf-8" },
body: JSON.stringify({ name: "张三" })
});
开发环境与 JVM 层也要对齐
IDE、编译器、JVM 默认编码不统一,会导致源码里的中文字符串在运行时被错误解析。✅ IntelliJ IDEA 设置:
- File → Settings → Editor → File Encodings → 全局编码、项目编码、属性文件编码 → 全设为 UTF-8
- Build → Compiler → Java Compiler → Target bytecode version 后勾选 “Use compiler encoding”
✅ Maven 编译插件(防止 javac 用错编码):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
✅ 启动 JVM 时强制指定(尤其部署到旧服务器时):
java -Dfile.encoding=UTF-8 -jar myapp.jar
⚠️ 注意:-Dfile.encoding 影响 String.getBytes()、new String(byte[]) 等无参方法,但不能替代代码中显式传参——它只是兜底,不是替代方案。


















