上一篇
确保Java正确显示中文需统一编码设置:源代码保存为UTF-8格式,控制台调整字符集支持中文(如Windows用chcp 65001),文件读写时显式指定UTF-8编码,数据库连接添加characterEncoding=UTF-8参数,关键点在于保持编码一致性,避免乱码。
核心问题:字符编码
Java默认使用Unicode(UTF-16)存储字符,但中文乱码通常由编码不一致引起:

- 源文件编码(如UTF-8 vs GBK)
- 输入/输出流编码
- 数据库连接编码
- 网络传输编码
解决方案与实操步骤
确保Java源文件编码正确
// 示例:显式指定源文件编码(编译器参数) javac -encoding UTF-8 Main.java
- IDE设置(关键步骤):
- Eclipse:
Window > Preferences > General > Workspace > Text file encoding > UTF-8 - IntelliJ:
File > Settings > Editor > File Encodings > Global/Project Encoding > UTF-8
- Eclipse:
控制台输出中文(解决乱码)
public class ChineseDisplay {
public static void main(String[] args) {
// 方法1:设置JVM启动参数(推荐)
// 命令行添加:-Dfile.encoding=UTF-8
// 方法2:代码中强制转换(应急方案)
try {
String chinese = "你好世界";
byte[] bytes = chinese.getBytes("UTF-8"); // 按需替换为GBK
System.out.println(new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
文件读写中文
// 写入文件(明确指定编码)
try (BufferedWriter writer = Files.newBufferedWriter(
Paths.get("data.txt"),
StandardCharsets.UTF_8)) { // 关键:指定UTF-8
writer.write("中文内容测试");
}
// 读取文件
try (BufferedReader reader = Files.newBufferedReader(
Paths.get("data.txt"),
StandardCharsets.UTF_8)) {
String line = reader.readLine();
System.out.println(line); // 正确显示中文
}
数据库中文支持(MySQL示例)
String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8"; // 关键参数: // useUnicode=true // characterEncoding=UTF-8
Web应用中文处理
- Servlet请求/响应:
// 在doGet/doPost方法中: request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); - Spring Boot配置(application.properties):
spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true
JVM默认编码检查
System.out.println("Default Charset: " + Charset.defaultCharset());
// 若输出非UTF-8,需通过启动参数修正:
// -Dfile.encoding=UTF-8
进阶排查技巧
- 编码诊断工具:
String str = "乱码样本"; System.out.println(Arrays.toString(str.getBytes())); // 查看原始字节
- 常见乱码模式对照:
- UTF-8字节用GBK解码:
浣犲ソ→你好 - GBK字节用UTF-8解码:(出现问号)
- UTF-8字节用GBK解码:
最佳实践总结
| 场景 | 解决方案 | 注意事项 |
|---|---|---|
| 源代码 | IDE全局设UTF-8 | 确保所有开发者环境一致 |
| 控制台 | JVM参数 -Dfile.encoding=UTF-8 |
优先修改系统环境变量 |
| 文件操作 | 显式指定StandardCharsets.UTF_8 |
避免依赖平台默认编码 |
| Web项目 | 过滤器统一设置request/response | Spring可用CharacterEncodingFilter |
| 数据库 | 连接串添加字符集参数 | MySQL需同时配置服务端编码 |
关键原则:显式优于隐式,任何涉及字符转换的地方,主动声明编码格式可规避99%的中文乱码问题。
引用说明
- Oracle官方文档:Java SE 18字符集指南
- Unicode标准:UTF-8与中文编码原理
- MySQL手册:字符集配置
通过以上步骤,Java中文显示问题可系统化解决,实际开发中建议从源码→运行环境→数据传输链路逐层验证编码一致性。


