likes
comments
collection
share

Linux字符集正常,但是Springboot打包jar后new File取不到中文路径,启动日志乱码

作者站长头像
站长
· 阅读数 10

问题点

线上某次服务器器重启后,导致jar包启动的日志乱码,添加 -Dfile.encoding=utf-8 后日志输出正常,但是存在new File 取不到中文路径的情况。file.exists()返回false;

排查思路

解决日志乱码问题

启动脚本中 java -jar命令添加-Dfile.encoding = utf-8 解决日志乱码的问题,但是中文路径依旧取不到文件,应该不是该问题导致。判断还是系统层面编码问题。

linux系统编码排查

查看linux系统的编码是UTF8编码,文件的编码也是utf-8的编码

echo $LANG

Linux字符集正常,但是Springboot打包jar后new File取不到中文路径,启动日志乱码

查看文件的编码格式采用第三方工具:文件格式也是UTF-8且正常展示,则说明不是文件编码问题

convmv

Linux字符集正常,但是Springboot打包jar后new File取不到中文路径,启动日志乱码 看到别的博客上需要修改vi /etc/sysconfig/i18n文件,改为LANG="zh_CN.UTF-8",但是我的线上服务器是CentOS7.x版本的,没有找到这个文件,后来发现centos7.x版本的文件在/etc/locale.conf 这个文件中;其中的编码也是UTF8 Linux字符集正常,但是Springboot打包jar后new File取不到中文路径,启动日志乱码 后续按照网上的思路修改系统配置文件 /etc/profile添加字符集编码后也不生效。考虑是否代码问题(可能性很低,因为重启linuxjar包并没有重新替换还是原来的jar包) Linux字符集正常,但是Springboot打包jar后new File取不到中文路径,启动日志乱码

java路径要转编码

尝试通过代码方式对文件路径进行编码,使用和系统统一的UTF-8方式

String path = URLDecoder.decode(fileAbsolutePath, "UTF-8");
File file = new File(path);

问题依旧没有解决,还是无法取到文件路径。

jar包编码问题

通过命令jinfo 进程号 查看java进程的详细信息,发现jar进程的编码有问题,用的是ANSI_X3.4-1968

Linux字符集正常,但是Springboot打包jar后new File取不到中文路径,启动日志乱码 发现问题的根本原因是jar包的编码方式不对导致,因为jar是通过systemctl方式启动,查看查看服务启动工具对环境变量的使用grep env /sbin/service Linux字符集正常,但是Springboot打包jar后new File取不到中文路径,启动日志乱码LANG="$LANG" 配置在env -i 后面,最后的结果如下所示,操作过程:

编辑service文件 vim /sbin/service

env -i 后面加上 LANG="$LANG"

添加后 重启操作系统(reboot

重新运行服务即可解决 日志文件乱码和中文路径取不到的问题