后台微服务运行在linux环境里,前端Vue。在一个项目中,把后台的文件打包成zip,下载到前台。结果发现zip文件名本身乱码,zip文件内压缩的文件也是乱码。所谓乱码,程序员都见过,就是中文变成了乱七八糟的字符。
起初觉得问题比较简单,网上导出都是解决方案。真正试试,一个不灵。最后还是公司技术大佬自己解决的。
不能说网上的东西都是错了,但确实很大一部分都是没有自己实践,直接转的。我们试了无效也不能说就是错的,可能和环境、版本等等都有关系。自己实践吧。
1、Zip文件中的文件名使用的是一种称为"CP437"的字符集编码,所以要按CP437编码文件名字。
ZipEntry ze = new ZipEntry(文件名字);
结果:文件名字这各种转换,无效,怎么折腾都是乱码,而且更乱。
我们案例的正解:
ZipOutputStream zos = new ZipOutputStream(fos);
zos.setEncoding(“UTF-8”);
2、zip文件名本身乱码
FileOutputStream fos = new FileOutputStream(文件名字);
文件名字这里也是各种转码,折腾,全部无效。
我们案例的正解:
问题根本就不出现在这里,而是出现在前端。文件名称是通过Content-Disposition头传递的,attachment; filename=文件名,这里的文件名字要java.net.URLEncoder.encode处理下。
如果各位也遇到类似问题,可以参照下。关键是分析到底那步出现的问题:是服务器端生成时出现的,还是传递过程中发生的。