Java读取.properties文件中文乱码的根本原因是JDK默认用ISO-8859-1编码加载,而中文需UTF-8;解决方法是确保文件为UTF-8无BOM,并用InputStreamReader指定UTF-8读取Properties。

Java 读取 .properties 文件时出现中文乱码,根本原因是:JDK 默认使用 ISO-8859-1 编码加载该文件,而中文在该编码下无法表示,导致转义(如 \u4f60\u597d)未被正确还原或原始中文被错误解码。
确保 properties 文件本身保存为 UTF-8(无 BOM)
这是前提。很多编辑器(如 VS Code、IntelliJ)默认保存为 UTF-8,但需确认:
– 不要勾选 “UTF-8 with BOM”;
– 在文件末尾手动添加一个中文字符并保存,用十六进制工具(如 HxD)查看其字节是否为合法 UTF-8(如“你好”应为 E4 BD A0 E5 A5 BD);
– 若看到 EF BB BF 开头,说明带 BOM,需另存为“UTF-8 no BOM”。
Java 8+ 推荐:用 InputStreamReader 指定 UTF-8 读取
Properties.load() 的重载方法支持传入带编码的 Reader,绕过默认 ISO-8859-1 解码逻辑:
Properties props = new Properties();
try (InputStream is = getClass().getResourceAsStream("/config.properties");
Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
props.load(reader);
}
这样,文件内容按 UTF-8 原样读入,\uXXXX 转义序列仍由 Properties 内部解析(它对 Unicode 转义的支持是独立且可靠的),中文文本能正常显示。
兼容旧版或需手动处理转义时:用 StringEscapeUtils.unescapeJava()
若因特殊原因必须用 load(InputStream)(即走 ISO-8859-1 路径),读出的中文会变成乱码字符串(如 ä½ å¥½),此时不能直接修复 —— 因为信息已损坏。但若你控制文件生成,可改用以下方式预处理:
立即学习“Java免费学习笔记(深入)”;
- 将中文统一写成
\uXXXX形式(如name=\u4f60\u597d),Properties 能自动识别并还原; - 或读取后对值做二次解码(仅限已知是 UTF-8 字节被误当 ISO-8859-1 解码的情况):
// 不推荐,属补救措施
String raw = props.getProperty("name");<br> String fixed = new String(raw.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
更稳妥的做法是避免走这条路径,优先采用 Reader 方式加载。
Spring Boot 用户:配置 spring.messages.encoding=UTF-8
若用 ResourceBundleMessageSource 加载 i18n 的 messages_zh.properties,需在 application.properties 中显式指定:
spring.messages.encoding=UTF-8 spring.messages.basename=messages
否则 Spring 默认仍用 ISO-8859-1,导致中文乱码。该配置会令底层 ResourceBundle.getBundle() 使用 UTF-8 Control 策略。


















