zip格式文件编码检测
解压后文件名乱码
由于zip格式文件无编码存储的结构,因此解压时无法知道原先的编码。
当解压zip格式文件时使用的编码和原编码不一致时,就可能会出现解压后文件名乱码问题。
猜测编码
基于上述问题,需要对zip格式文件所使用的编码进行猜测。
笔者使用基于统计学原理的 juniversalchardet 库来猜测编码,下面是maven依赖坐标。
<dependency>
<groupId>com.googlecode.juniversalchardet</groupId>
<artifactId>juniversalchardet</artifactId>
<version>1.0.3</version>
</dependency>
下面是一个简单的例子,只需要提供待猜测文本的字节数据即可。
UniversalDetector detector = new UniversalDetector(null);
String text = "这是一段测试文本";
byte[] buf = text.getBytes("GB18030");
detector.handleData(buf, 0, buf.length);
detector.dataEnd();
System.out.println(detector.getDetectedCharset()); // GB18030
zip格式文件结构
zip格式文件的结构如下(具体解析见其他文章),这里需要其中的 CENTRAL_DIRCETORY_HEADER 区域,该区域存储zip里所有的文件及文件夹的名称。
|LOCAL_FILE_HEADER|
|EXTRA_LOCAL_HEADER|
|CENTRAL_DIRCETORY_HEADER|
|END_OF_CENTRAL_DIRCETORY_RECORD|
利用Apache Compress库获取名称字节数据
笔者一般推荐使用 Apache Compress 库来处理zip格式文件,可以使用 ZipArchiveEntry.getRawName 方法来获取名称的字节数据。
下面是检测zip格式文件编码的例子,其中为了加快速度忽略解析Local file header区域。
public String detectCharset(File file) throws IOException {
// Ignore resolve local file header to improve rate.
ZipFile zipFile = new ZipFile(file, StandardCharsets.UTF_8.name(), true, false);
Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
UniversalDetector detector = new UniversalDetector(null);
while (entries.hasMoreElements()) {
ZipArchiveEntry entry = entries.nextElement();
byte[] buf = entry.getRawName(); // Get the byte data of file name.
detector.handleData(buf, 0, buf.length);
}
detector.dataEnd();
return detector.getDetectedCharset();
}
下面是Apache Compress库的依赖坐标。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version>
</dependency>
注意事项
数据量越大 juniversalchardet 库检测编码就越准确,反之可能得到空结果或者不准确的编码。
例如猜测编码章节中让 text="中文" ,最后输出的结果是 KOI8-R。
为此实际使用中要根据业务场景来做限定,比方说系统面向的用户只可能是中文用户,那么当出现 KOI8-R 这种斯拉夫文字的编码时应当限定为中文的 GB18030 编码(数据量小时GB18030非常大概率会被检测成KOI8-R)。
zip格式文件编码检测的更多相关文章
- 文件编码检测.ZC一些资料(包含java的)
1.IMultiLanguage3 或者 IMultiLanguage2 1.1.怎么判断XML 的编码格式(UTF-8或GB2312等)-CSDN论坛.html(https://bbs.csdn.n ...
- Linux下zip格式文件的解压缩和压缩
Linux下zip格式文件的解压缩和压缩 Linux下的软件包很多都是压缩包,软件的安装就是解压缩对应的压缩包.所以,就需要熟练使用常用的压缩命令和解压缩命令.最常用的压缩格式有.tar.gz/tgz ...
- java压缩/解压缩zip格式文件
因为项目要用到压缩.解压缩zip格式压缩包,只好自己封装一个,对于网上流行的中文乱码的问题,本文的解决方法是用apache的包代替jdk里的.基本上还是比较好用的. 废话少说,直接上代码. } ...
- 文件编码检测.ZC
1.今天(20181101) 发现 g文件中的 xml头 和 文件编码不一致,最后发现 貌似是我搞错了,人家的文件 编码方式写的是对的. 我发现的现象是:XML里面写的是"GBK" ...
- 使用C#压缩解压rar和zip格式文件
为了便于文件在网络中的传输和保存,通常将文件进行压缩操作,常用的压缩格式有rar.zip和7z,本文将介绍在C#中如何对这几种类型的文件进行压缩和解压,并提供一些在C#中解压缩文件的开源库. 在C#. ...
- 下载zip格式文件(压缩Excel文件为zip格式)
Mongodb配置文件参考这一篇:http://www.cnblogs.com/byteworld/p/5913061.html package util; import java.io.Buffer ...
- LearnPython - Zip格式文件的解压缩
import zipfile import os def unzip(zip_name, target_dir): files = zipfile.ZipFile(zip_name) for zip_ ...
- 关于springmvc下服务器文件打包成zip格式下载功能
关于springmvc下服务器文件打包成zip格式下载功能 2016年09月21日 11:22:14 toxic_guantou 阅读数:5731更多 个人分类: 技术点存储 版权声明:本文为博主 ...
- Eclipse设置软tab(用4个空格字符代替)及默认utf-8文件编码(unix)
简单配置版本: Eclipse設置 一.window->Preferences-> General-Editors->Text Editors , 右边勾选insert spaces ...
随机推荐
- 从0开始基于Webpack5 搭建HTML+Less 前端工程
基于Webpack5 搭建HTMl+Less的前端项目 新建一个文件夹(比如命名为webpack) 用编辑器打开该文件夹,并在编辑器的终端执行 npm init -y 自动创建pa ...
- Metalama简介5.配合VisualStudio自定义重构或快速操作功能
使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题 Metalama简介1. 不止是一个.NET跨平台的编译时AOP框架 Metalama简介2.利用Aspect在编译时进行消除重 ...
- 2003031121-浦娟-python数据分析第三周作业-第一次作业
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/pexy/20sj 作业链接 https://edu.cnblogs.com/campus/pexy/20s ...
- netty系列之:netty中常用的对象编码解码器
目录 简介 什么是序列化 重构序列化对象 序列化不是加密 使用真正的加密 使用代理 Serializable和Externalizable的区别 netty中对象的传输 ObjectEncoder O ...
- 56. Merge Intervals - LeetCode
Question 56. Merge Intervals Solution 题目大意: 一个坐标轴,给你n个范围,把重叠的范围合并,返回合并后的坐标对 思路: 先排序,再遍历判断下一个开始是否在上一个 ...
- 821. Shortest Distance to a Character - LeetCode
Question 821. Shortest Distance to a Character Solution 思路:遍历字符串S,遇到与字符C相等就分别向左/右计算其他字符与该字符的距离,如果其他字 ...
- python之数据类型的内置方法(str, list)
目录 字符串的内置方法 移除首尾指定字符 字母大小写相关操作 判断字符串的开头或结尾是否是指定字符 字符串特殊的输出方法 拼接字符串 替换指定字符 判断是否是纯数字 查找指定字符对应的索引值 文本位置 ...
- 渗透测试之sql注入验证安全与攻击性能
由于渗透测试牵涉到安全性以及攻击性,为了便于交流分享,本人这里不进行具体网址的透露了. 我们可以在网上查找一些公司官方网站如(http://www.XXXXXX.com/xxxx?id=1) 1.拿到 ...
- ESP8266 系统环境搭建
1. 前言 因为ESP8266/ESP32这个开发环境没少折腾,是真没见过这么难搞又不清晰的环境. 简单开发可以使用Arduino IDE ,这个平台还是挺好的.开发使用Arduino的函数库,很高效 ...
- Canal-监听数据库表的变化
1. 简介 Canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费功能. 工作原理 Mysql主备复制原理 MySQL master 将数据变更 ...