Java中文乱码本质是字符编码与解码不匹配,核心解决路径为全程统一UTF-8编码、显式指定字符集、杜绝依赖平台默认。

Java中因字符集编码转换导致的文本内容丢失,本质是字节与字符映射不一致引发的乱码或截断,并非“精度”问题(该词通常用于数值计算),而是字符表示失真。解决核心在于全程统一编码、显式指定、避免依赖平台默认。
统一项目级默认编码为UTF-8
这是最基础也最关键的一步。Windows默认GBK、Linux/macOS默认UTF-8,混用必然出错。
- 编译时加参数:
-encoding UTF-8,确保源文件字符被正确解析 - IDE中设置:IntelliJ IDEA或Eclipse需将项目编码、文件编码、控制台编码全部设为UTF-8
- 构建工具配置:Maven在
pom.xml中添加<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
文件读写必须显式指定字符集
使用InputStreamReader/OutputStreamWriter或NIO的Files类时,绝不依赖无参构造函数或默认Charset。
- 错误写法:
new InputStreamReader(new FileInputStream("a.txt"))→ 用系统默认编码,不可控 - 正确写法:
new InputStreamReader(new FileInputStream("a.txt"), StandardCharsets.UTF_8) - NIO推荐:
Files.readAllLines(Paths.get("a.txt"), StandardCharsets.UTF_8) - 写入同理,如
Files.write(path, lines, StandardCharsets.UTF_8)
网络与数据库交互明确声明编码
HTTP请求头、响应解析、JDBC连接字符串都需绑定UTF-8。
立即学习“Java免费学习笔记(深入)”;
- HTTP客户端(如OkHttp):设置
Content-Type: text/plain; charset=utf-8,响应体解析时用response.body().string()(自动按响应头charset解码)或手动指定response.body().bytes()后用new String(bytes, StandardCharsets.UTF_8) - JDBC URL追加参数:
?useUnicode=true&characterEncoding=UTF-8(MySQL);PostgreSQL用?charSet=UTF-8 - 数据库本身字符集也要匹配:MySQL建库用
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
日志与控制台输出保持编码一致
尤其部署到Linux服务器后中文日志变问号,多因终端或日志框架未设UTF-8。
- Logback配置中,在
<encoder>内添加:<charset>UTF-8</charset> - 启动脚本加JVM参数:
-Dfile.encoding=UTF-8,强制JVM默认Charset - Linux终端确认:
locale | grep UTF,若非UTF-8,需设置export LANG=en_US.UTF-8等


















