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 ...
随机推荐
- 虚拟机VMware 安装centos、常规配置、共享文件等
安装centos7[通过vm来安装运行centos7] 一.准备工作 1.centos7 的安装镜像下载链接:http://isoredirect.centos.org/centos/7/isos/x ...
- [LBS学习笔记4]地理特征POI、AOI、路径轨迹
1 简述 今天继续LBS地理信息的学习,目标是写到10篇博客的时候,做出一个地图工具页面用,包含地图空间索引Geohash.S2.H3的可视化展示. 地理特征分为点(POI).线(路径).面(AOI) ...
- Docker将镜像文件发布到阿里云
一.创建新镜像文件 1.创建容器并在容器内创建一个文件夹 在容器内创建一个新文件主要是为了代表这个容器非镜像文件直接创建的容器,而是通过自定义在容器内创建了属于自己的文件 2.提交容器副本使之成为一个 ...
- .NET混合开发解决方案15 WebView2控件集成到WinForm程序编译后的文件及结构说明
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件应用详解系列博客 .NET桌面程序集成Web网页开发的十种解决方案 .NET混合开发解决方案1 WebView2简介 .NE ...
- 试驾 Citus 11.0 beta
https://www.citusdata.com/blog/2022/03/26/test-drive-citus-11-beta-for-postgres/ Citus 11.0 beta 的最大 ...
- 干掉RedisHelper,请这样用分布式缓存
前言 我们在项目中使用Redis时通常是写一个单例模式的RedisHelper静态类,暴露一些常用的Get.Set等操作,在需要使用地方直接RedisHelper.StringGet(xx,xx)就可 ...
- CentOS下sudo的使用和sudoers配置
一.sudo命令 sudo [参数选项] 命令 参数选项 -l:列出目前用户可执行与无法执行的指令: -v:延长密码有效期限5分钟: -u<用户>:以指定的用户作为新的身份.若不加上此参数 ...
- find-文件搜索
根据条件搜索文件. 语法 find 目录 [选项] 选项 -name <filename> 按文件目录名查找.文件目录名可使用通配符"*",即表示模糊匹配所有字符. - ...
- 没错,就是Access-Control-Allow-Origin,跨域
服务端添加: <add name="Access-Control-Allow-Origin" value="*" /><add name=&q ...
- CF1682D Circular Spanning Tree
题意: 构造题,节点1~n顺时针排列成圆形,告诉你每个点度数奇偶性,让你构造一棵树,树边不相交. 思路: 因为每条边给总度数贡献2,因此如果度数为1的点有奇数个,直接输出no.显然0个度数为1的,也输 ...