java解压ZIP 解决中文乱码 (GBK和UTF-8)
本文简书地址
工具使用 : zip4j
GitHub : zip4j
版本 : 2.2.8
Maven :
net.lingala.zip4jgroupId>
zip4jartifactId>
2.2.8version>
dependency>
ZIP解压现状
ZIP格式在不同平台上使用不同软件压缩,大致结果为两类:
1. Windows下使用WinRAR、好压、快压、百度压缩等工具压缩的文件
特点:文件名为GBK编码
2. 使用Linux、MacOS等系统压缩的zip文件
特点:文件名为UTF-8编码
过往解决方案
通过指定解压时的文件名编码类型来解决,最简单粗暴的就是
ZipFile zip = new ZipFile(dest);
//直接指定GBK,反正大多数人用win操作
zip.setFileNameCharset("GBK");
zip.extractAll(Constants.GOODS_ITEM_IMG_PATH);
但是现在用macOS办公的人越来越多,这种写法已经不满足需求了
新解决方案
通过阅读ZIP的协议文档,我们可以发现,Info-ZIP Unicode Path Extra Field (0x7075)
这个额外信息可以解决我们的问题,据笔者测试,WinRAR和百度压缩等使用GBK作为文件编码的压缩软件,
在这个区域会记录文件名的UTF-8编码的名称,但是因为这个字段不是必要字段,文件名使用UTF-8编码的
MacOS归档、Deepin归档等软件不会填充这个信息。
解决方案代码
String extractAll(MultipartFile file) throws Exception {
String path = RECEIVABLE_SHEET_PATH;
if(!new File(path).mkdirs()) {
return "上传文件失败,无法创建临时文件夹";
}
File dest =