**文件名显示为:

??.txt

1.一开始我以为是创建文件的时候文件名需要编码解码,于是在代码里采用下面的方式
使用String.getBytes(指定编码)方法;

String fileName = "测试.txt";
File file = new File(new String(fileName.getBytes("UTF-8")))
file.createNewFile(file );

失败!
2.然后网上查资料看到有一个System.getProperty(“file.encoding”),还有一个System.getProperty(“sun.jnu.encoding”),在网上查询file.encoding和sun.jnu.encoding的区别
知道了file.encoding影响的是文件的编码,sun.jnu.encoding影响文件名,将这两个值放在响应体中,PostMan调服务器上的应用接口,得到

file.encoding = “UTF-8”
sun.jnu.encoding = "ANSI_X3.4-1968"

大概就知道应该是这个编码导致的文件名显示为“?”了
3.然后采用代码的方式去修改

System.setProperty(("sun.jnu.encoding"),"UTF-8")

访问接口得到

file.encoding = “UTF-8”
sun.jnu.encoding = "UTF-8"

但是文件名还是问号。。。我整个人直接就问号了

4.实在解决不了了,又搜。然后知道了还可以修改服务器的编码什么的,加环境变量设置语言,没用。
然后又搜,知道了可以在微服务启动的时候设置sun.jnu.encoding编码,然后就去tomcate的catalina.sh文件里面加上JVM启动参数,如下:

export LC_ALL="zh_CN.UTF-8"
CLASSPATH=
JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"

结果还是没用。。
5.最后问了公司的大佬,大佬来看是启动服务使用了supervisor进程管理工具,然后就找到它启动服务的配置文件,每个服务有一个配置文件,我的在/etc/supervisor/conf.d这个目录下面,然后找到那个微服务的app.cfg.conf,进入文件发现它是使用"java -jar"命令行的方式启动服务,然后里面只有对file.encoding的配置,缺少对sun.jnu.encoding的设置,就在那里面添加启动参数

-Dsun.jnu.encoding=UTF-8

最后一句加上:enviroment=LANG=zh_CN.UTF-8

6.然后使用 ctl update 更新配置,自动重启服务,再调用接口生成文件,文件名中文显示正常,终于好了。。。

测试.txt
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐