中文乱码的根本原因是文件编码与java读取时的解码方式不一致;应先用编辑器或file/enca命令确认文件实际编码,再通过inputstreamreader显式指定standardcharsets.utf_8等统一编码读取。

读取文件时出现中文乱码,根本原因是文件实际编码和 Java 程序读取时使用的解码方式不一致。比如文件是 UTF-8 编码保存的,但程序用 GBK 去读,一个汉字的 3 字节就会被错误拆成两个“伪字符”,结果就是“锟斤拷”或问号。
确认并统一文件编码
先别急着改代码,得知道文件本来是什么编码:
- 用编辑器(如 Notepad++、VS Code)打开文件,右下角会显示当前识别的编码(如 UTF-8、GBK、ANSI)
- 在 Linux/macOS 下可用命令:
file -i filename.txt或enca filename.txt - 如果不确定,可尝试几种常见编码读取后观察效果,优先试 UTF-8 和 GBK
显式指定 InputStreamReader 编码
不要用 FileReader——它依赖系统默认编码(Windows 是 GBK,Linux/macOS 多是 UTF-8),极易跨平台出错。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
正确做法是组合使用 FileInputStream + InputStreamReader,并明确传入编码名:
try (InputStreamReader reader = new InputStreamReader(
new FileInputStream("data.txt"), StandardCharsets.UTF_8)) {
BufferedReader br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line); // 中文正常显示
}
}
- 推荐用
StandardCharsets.UTF_8(类型安全,无异常)而非字符串"UTF-8" - StandardCharsets.UTF_8 换成
Charset.forName("GBK") - cpdetector 或
juniversalchardet库自动探测
构建工具与 IDE 的配套设置
即使代码写对了,IDE 或构建工具默认编码不对,也会让源文件本身保存出错:
- IntelliJ IDEA:File → Settings → Editor → File Encodings → 全局编码、项目编码、默认编码均设为 UTF-8
- Eclipse:Preferences → General → Workspace → Text file encoding → UTF-8
-
Maven:在
pom.xml中添加属性确保编译不乱码:<project.build.sourceencoding>UTF-8</project.build.sourceencoding>
处理已有乱码文件的补救
如果文件已读错、存成乱码(比如把 UTF-8 内容用 GBK 重写了一遍),原始信息可能已损坏。但若只是“显示错”,而字节未变,可尝试反向还原:
- 把当前乱码字符串(如 "ä½ Ã¥¥½")用其“误读编码”(如 ISO-8859-1)转回字节数组
- 再用原始正确编码(如 UTF-8)重新构造字符串:
new String(misreadStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) - 这类操作适合小批量修复;生产环境建议从源头规范编码,避免补救
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










