Java 8 服务读 messages_zh.properties,接口返回的“订单已支付”变成“订å•已支付”,同一文件在 IDEA 里预览正常。日志里能对上时间点,这种反而好排。

ResourceBundle 在 Java 8 默认按 ISO-8859-1 读 properties,文件实际是 UTF-8 存的。字节被逐位当成 Latin-1 字符,再输出时已经不可逆。Java 9 之后默认改成 UTF-8,这个服务还停在 8。这一点先确认清楚,后面就不用反复试。

native2ascii -encoding UTF-8 messages_zh.properties messages_zh_ascii.properties
java -Dfile.encoding=UTF-8 -jar app.jar

这次卡住的地方就在「properties 中文乱码」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:用 native2ascii 或构建插件把文件转成 Unicode 转义;或显式用 UTF-8 的 PropertyResourceBundle 构造 不走默认加载;确认打包后的文件编码 别只改源码目录;重启后打开一个中文词条 对比返回字节。

结果对不对很好判断,接口返回的中文恢复为“订单已支付”,日志里不再出现乱码字节。

作者 9823189