歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> winzipaes文件名亂碼解決方案

winzipaes文件名亂碼解決方案

日期:2017/3/1 9:37:44   编辑:Linux編程

winzipaes是一個開源的基於javaZip的加密壓縮工具

目前代碼托管在google上(http://code.google.com/p/winzipaes)

需要依賴bcprov的包,可以去maven上下載,也可以在Linux公社資源下載,見本文下面的下載地址。

用過的人可能都會發現當使用它,往壓縮包裡添加的文件名有漢字時,會出現亂碼

這是因為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包的壓縮格式,想深入研究的同學可以參考下:http://www.pkware.com/documents/casestudies/APPNOTE.TXT

然後將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();

本文相關資源下載

------------------------------------------分割線------------------------------------------

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2014年資料/11月/6日/Java解壓帶密碼的RAR壓縮文件

下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm

------------------------------------------分割線------------------------------------------

Copyright © Linux教程網 All Rights Reserved