zip4j 乱码

使用的zip4j版本号:

implementation "net.lingala.zip4j:zip4j:2.11.1"

最近因项目需要用到zip压缩和解压,包含密码压缩包,用到了zip4j这个库,在测试的过程中,发现分别使用mac、windows压缩的zip包,在解压时会出现乱码情况,这个问题的主要原因是,在解压时设置的编码格式不对,导致的乱码。

解决方案:
1、因为zip4j 默认UTF-8编码,如果是windows压缩包(windows默认是GBK编码),解压后会出现乱码。
2、基于上,只要判断文件名中有乱码,设置编码格式为GBK,即可解决。

代码如下:

  public static void unZip(String srcFilePath, String destFilePath) {
         unZip(srcFilePath, destFilePath,"");
    }

    public static void unZip(String srcFilePath, String destFilePath, String password) {
        try {
            net.lingala.zip4j.ZipFile zFile = new net.lingala.zip4j.ZipFile(srcFilePath);
            zFile.setCharset(StandardCharsets.UTF_8);
            List<FileHeader> headers = zFile.getFileHeaders();
            if (isRandomCode(headers)) {//判断文件名是否有乱码,有乱码,将编码格式设置成GBK
                zFile.close();
                zFile = new net.lingala.zip4j.ZipFile(srcFilePath);
                zFile.setCharset(Charset.forName("GBK"));
            }
            if (!zFile.isValidZipFile()) {
                throw new ZipException("压缩文件不合法,可能被损坏.");
            }
            if (zFile.isEncrypted() && !TextUtils.isEmpty(password)) {//加密zip,且输入的密码不为空,直接进行解密。
                zFile.setPassword(password.toCharArray());
            }
            File destDir = new File(destFilePath);
            if (!destDir.getParentFile().exists()) {
                destDir.mkdir();
            }
            zFile.extractAll(destFilePath);
        }catch (Exception exception){
            exception.printStackTrace();
        }
    }

      //待解压的文件名是否乱码
    private static boolean isRandomCode(List<FileHeader> fileHeaders) {
        for (int i = 0; i < fileHeaders.size(); i++) {
            FileHeader fileHeader = fileHeaders.get(i);
            boolean canEnCode = Charset.forName("GBK").newEncoder().canEncode(fileHeader.getFileName());
            if (!canEnCode) {//canEnCode为true,表示不是乱码。false.表示乱码。是乱码则需要重新设置编码格式
                return true;
            }
        }
        return false;
    }
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值