使用zip4j解压zip时文件名乱码解决最好的方案

zip4j解压zip时,出现中文乱码,看了下,zip4j解压时支持设置文件编码,我们只需要识别文件是不是utf-8编码,如果不是utf-8就使用gbk解压,但是这个判断没有100%准确的方式,我试过通过字节流的bom标记去判断,但是文件不一定有bom字节,所以不适用。

网上最多的判断方式是使用第三方jar工具cpdetecpor或juniversalchardet,但是这两种方式我都尝试过,juniversalchardet无法判断出文件编码,而cpdetecpor可以得到一个判断结果,但是也不准确,我经过一两天的探索查找,找到了一个比较靠谱的方式:

    /*** 解压*/@SneakyThrowspublic static void unzipFile(String zipFilePath, String destFilePath, String password) {ZipFile zipFile = null;try {zipFile = new ZipFile(zipFilePath);zipFile.setCharset(StandardCharsets.UTF_8);List<FileHeader> headers = zipFile.getFileHeaders();//判断文件名是否有乱码,有乱码,将编码格式设置成GBKif (isRandomCode(headers)) {log.info("使用UTF-8解压文件【{}】时乱码,尝试使用GBK重新解压",zipFilePath);zipFile.close();zipFile = new ZipFile(zipFilePath);zipFile.setCharset(Charset.forName("GBK"));}if (!zipFile.isValidZipFile()) {throw new VerifyException("压缩文件不合法,可能被损坏.");}if (zipFile.isEncrypted() && StringTool.isNotBlank(password)) {//加密zip,且输入的密码不为空,直接进行解密。zipFile.setPassword(password.toCharArray());}FileTool.createDir(destFilePath);zipFile.extractAll(destFilePath);}finally {IOUtils.closeQuietly(zipFile,null);}}private static boolean isRandomCode(List<FileHeader> fileHeaders) {for (FileHeader fileHeader : fileHeaders) {boolean canEnCode = Charset.forName("GBK").newEncoder().canEncode(fileHeader.getFileName());if (!canEnCode) {//canEnCode为true,表示不是乱码。false.表示乱码。是乱码则需要重新设置编码格式return true;}}return false;}

我们先使用utf-8读取zip里面的文件名,然后判断文件名是否能使用gbk进行编码,如果不能,我们就用utf-8解压,如果gbk可以编码,就使用gbk进行解压

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《动手学深度学习(PyTorch版)》笔记7.5

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

聚观早报 | iOS 17.4正式版将上线;魅族21 Pro或下月发布

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 2月5日消息 iOS 17.4正式版将上线 魅族21 Pro或下月发布 小米MIX Flip细节曝光 OPPO Find X7 Ultra卫星通信版 …

BUUCTF-Real-[ThinkPHP]IN SQL INJECTION

目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间&#xff1a; 2018-09-04 CVE 参考&#xff1a;CVE-2018-16385 最高严重级别&#xff1a;低风险 受影响的系统&#xff1a;ThinkPHP < 5.1.23 漏洞描述&#xff1a; ThinkPHP是一款快速、兼容、简单的轻量级国产P…

Java实现用户画像活动推荐系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

Java智慧云智能教育平台

技术架构&#xff1a; SpringBoot Mybatis Shiro mysql redis 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; 支持多种题型&#xff1a;选择题、多选题、判断题、填空题、综合题以及数学公式。支持在线考试&#xff0c;教师在线批改试卷。 功能模块&am…

02. k210-在windows环境下烧录.bin文件

有些人的虚拟机串口可能没有设置好&#xff0c;不能在ubuntu下使用命令kflash 下载程序&#xff0c;那么本章介绍如何在windows10 环境下使用荔枝派的开源上位机 kflash_gui 来下载程序。 使用的开发板是荔枝派&#xff1a;Sipeed Maix Bit (带麦克风) 开发板。 1. 下载kflash_…

业务架构设计之汽配供应链与实现的实践总结

随着汽车行业的不断发展&#xff0c;汽配供应链的规模和复杂度也在不断增加。为了满足市场需求&#xff0c;建立一个高效、可靠的汽配供应链业务系统至关重要。本文将总结一些关键的实践经验&#xff0c;帮助读者了解如何设计和实现一个稳定且高效的汽配供应链业务系统。 1. 业…

第1节、电路连接【51单片机+L298N步进电机系列】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍如何搭建一个51单片机L298N步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境。 一、硬件清单 ①51单片机模块 ②恒流模块 ③开关电源 ④L298N模…

hexo和github.io博客的搭建

简要&#xff1a; 最近在牛客网上看到有很多应届毕业生大佬的求职简历上都写上了自己的博客地址&#xff0c;并且在acwing上看到图图佬&#xff0c;铅笔佬也有自己的博客地址&#xff0c;大部分都采用了自己搭建博客的方式&#xff0c;而不是用脏乱差的csdn来写博客。所以我也采…

项目02《游戏-08-开发》Unity3D

基于 项目02《游戏-07-开发》Unity3D &#xff0c; 本次任务做物品相互与详情的功能&#xff0c; 首先要做 点击相应&#xff0c; 接下来用接口实现点击相应事件&#xff0c;具体到代码中&#xff0c;我们找到需要响应鼠标事件的对象&#xff0c; 双击PackageCell…

C++ //练习 4.23 因为运算符的优先级问题,下面这条表达式无法通过编译。根据4.12节中的表(第147页)指出它的问题在哪里?应该如何修改?

C Primer&#xff08;第5版&#xff09; 练习 4.23 练习 4.23 因为运算符的优先级问题&#xff0c;下面这条表达式无法通过编译。根据4.12节中的表&#xff08;第147页&#xff09;指出它的问题在哪里&#xff1f;应该如何修改&#xff1f; string s "word"; stri…

前端实现标题滚动点击导航

效果图 右边滚动的html代码 <div class"right-box"><el-tabs v-model"isScrollNow" tab-position"right" class"updateTab" tab-click"scrollTo"style"height: fit-content;"><el-tab-pane label…

Hadoop-IDEA开发平台搭建

1.安装下载Hadoop文件 1&#xff09;hadoop-3.3.5 将下载的文件保存到英文路径下&#xff0c;名称一定要短。否则容易出问题&#xff1b; 2&#xff09;解压下载下来的文件&#xff0c;配置环境变量 3&#xff09;我的电脑-属性-高级设置-环境变量 4.详细配置文件如下&#…

vue3(笔记)

组合式Api setup-----相当于beforeCreate, create生命周期 reactive–定义状态 对象形式 响应式原理 toRefs— Pinia &#xff08;只有state、getters和actions&#xff09; 更加简洁的语法&#xff0c;完美支持Vue3的Composition api 和 对TypesCcript的完美支持

sort 函数的从大到小排序以及 ? 的运用

sort 函数位于头文件 #include <algorithm> 中&#xff0c;起到排序数组类型的数据结构的作用&#xff0c;对于从小到大排序&#xff0c;sort 函数的默认快排就可以做到&#xff1a; #include <iostream> #include <algorithm> using namespace std; int mai…

JVM 性能调优 - Java 虚拟机内存体系(1)

Java 虚拟机我们简称为 JVM&#xff08;Java Virtual Machine&#xff09;。 Java 虚拟机在执行 Java 程序的过程中&#xff0c;会管理几个不同的数据区域。如下图所示&#xff1a; 下面我会介绍这几个数据区的特点。 堆 堆区的几个特点&#xff1a; 线程共享。启动时创建堆…

Vue ElementUI中el-table表格嵌套样式问题

一、表格嵌套要求&#xff1a; 两个表格嵌套&#xff0c;当父表格有children数组时子表格才展示&#xff1b;子表格数据少于父表格展示字段&#xff0c;且对应固定操作列不同&#xff1b; 二、嵌套问题&#xff1a; 当使用el-table的typeexpand实现表格嵌套时&#xff0c;样…

Rouge评估方法介绍及使用

Rouge评估方法的使用 文本摘要评估方法介绍&#xff1a; 内部评价方法&#xff1a;提供参考摘要&#xff0c;以参考摘要为基准评价系统摘要的质量。系统摘要与参考摘要越吻合&#xff0c;质量越高。 Edmundson: 适于抽取式文本摘要&#xff0c;比较机械文摘(自动文摘系统得到的…

配置Jenkins自动构建打包项目

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 需求说明 1、给A项目配置jenkins每2小时无条件自动构建一次&#xff0c;无论是否有代码提交。 2、给B项目配置jenkins每15分钟检…

Spring Data Envers 数据审计实战2 - 自定义监听程序扩展审计字段及字段值

上篇讲述了如何在Spring项目中集成Spring Data Envers做数据审计和历史版本查看功能。 之前演示的是业务表中已有的字段进行审计&#xff0c;那么如果我们想扩展审计字段呢&#xff1f; 比如目前对员工表加入了Audited审计&#xff0c;员工表有个字段为dept_id&#xff0c;为…