winzipaes文件名乱码解决方案

winzipaes是一个开源的基于javaZip的加密压缩工具
目前代码托管在google上(http://code.google.com/p/winzipaes)
需要依赖bcprov的包,去maven上拿吧([url]http://search.maven.org/remotecontent?filepath=bouncycastle/bcprov-jdk16/140/bcprov-jdk16-140.jar[/url])

用过的人可能都会发现当使用它,往压缩包里添加的文件名有汉字时,会出现乱码
这是因为winzipaes默认使用的iso-8859-1编码格式,不乱吗才怪啊。。

下面是我的修改方法,基于的是(winzipaes_src_20120104.zip)不对的地方,大虾别拍我啊

首先在ExtZipOutputStream里添加一个设置编码格式的方法,如下:
public void setEncoding(String encoding) {
this.encoding = encoding;
utf8Flg |= isUTF8(encoding);
}

protected boolean isUTF8(String encoding) {
if (encoding == null) {
// check platform's default encoding
encoding = System.getProperty("file.encoding");
}
return "UTF8".equalsIgnoreCase(encoding)
|| "UTF-8".equalsIgnoreCase(encoding);
}

这里有个地方需要注意,当文件名是utf8编码格式的时候,需要设置Zip包的通用位标志
第十一个比特为1,代码修改如下:

修改ExtZipEntry类的initEncryptedEntry方法
public void initEncryptedEntry(boolean utf8Flg) {
setCrc(0); // CRC-32 / for encrypted files it's 0 as AES/MAC checks integritiy

this.flag |= 1; // bit0 - encrypted

if (utf8Flg) {
this.flag |=(1 << 11); // 通用位标志第十一个比特为1
}
//flag |= 8; // bit3 - use data descriptor

....
}

另附上ZIP包的压缩格式,想深入研究的同学可以参考下:[url]http://www.pkware.com/documents/casestudies/APPNOTE.TXT[/url]


然后将ExtZipOutputStream的134行和158行的iso-8859-1替换成上面设置的编码格式
接着,再将106行文件名长度取得的代码改成entry.getName().getBytes(encoding).length

以上就是大致的修改点。
把完整的修改代码也打了个包,省得大家再去修改啦,希望对大家有帮助。

写个简单的使用sample吧:

AESEncrypterBC bc = new AESEncrypterBC();
AesZipFileEncrypter azfe = new AesZipFileEncrypter(
new File("要生成的zip包名.zip"), bc);
azfe.setEncoding("UTF-8"); // 编码格式是在这传进去的
azfe.add(new File("要往zip包里添加的文件路径"), "zip包里显示的文件名字", "密码");
azfe.close();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值