2015-07-19 98 views
1

我們的團隊有一個程序可以生成用Java編寫的PDF。可以使用非ASCII文件名的PDF使用Apache Commons Compress進行壓縮。然後將zip文件上傳到S3,由Windows和Mac客戶端下載。如何創建具有非ASCII文件名的Windows本機兼容Zip文件

當使用本機工具在Mac上解壓縮時,文件將以正確的文件名重新創建。但是,當試圖使用本地Windows UI工具解壓縮時,文件名被錯誤地創建。

的壓縮過程是:

import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; 

,我必須添加以下代碼,它仍然沒有工作,在Windows上顯示亂碼:

zipFile.setEncoding("UTF-8"); 
    zipFile.setUseLanguageEncodingFlag(true);  
    zipFile.setCreateUnicodeExtraFields(ZipArchiveOutputStream.UnicodeExtraFieldPoli‌​cy.ALWAYS); 

如何創建壓縮文件,可以是由Mac和Windows使用?

+0

是的,這是UTF8,和什麼版本的Windows?並非所有的窗口都使用UTF8進行文件名編碼。 – ydobonebi

+0

Windows 7中,文件名是utf-8編碼,mac可以正確顯示,但windows不能,我應該爲Windows生成一個不同版本的文件名,或者有一些方法可以將關於編碼的自描述元數據添加到文件名這樣平臺可以據此推斷? – tao

+0

如何生成在文件名中使用的utf非ascii字符? – ydobonebi

回答

1

根據Apache的百科全書壓縮頁面:(https://commons.apache.org/proper/commons-compress/zip.html

Windows的‘壓縮文件夾’功能不承認任何標誌或額外的領域,並創建使用平臺的默認編碼檔案 - 並期望檔案是在閱讀時使用該編碼。

如果Windows的‘壓縮文件夾’是你的主要消費者,那麼你最好的選擇是明確設置編碼到目標平臺。您可能希望啓用Unicode額外字段的創建,以便支持它們的工具將正確提取文件名。

因此:

如果你知道你的Windows用戶都設在地球和您的文件名的有限區域僅限於該地區(例如,所有拉丁),你可以聽從Apache的意見和定義用於文件名編碼的8位代碼頁,這將被OS X的解壓縮所支持。但是,這意味着它不適用於不同地區的Windows機器,或意外使用稍微不同的代碼頁(北美和西歐)。

明智的選擇是在Windows上使用替代歸檔工具,並可能使用替代歸檔格式。也許你可以通過在zip文件中預先提供一個合適的提取工具來爲Windows創建自解壓文件。例如,你可以在這裏使用粗糙說明在Java中創建一個自解壓7zip壓縮包:http://sourceforge.net/p/sevenzip/discussion/45798/thread/de8aa3c6

僞格式爲:

7z.sfx + config.txt + your-created-archive.7z your-created-archive.exe 

7z.sfx是7zip的自解壓可執行文件「頭」分佈式與7zip。

在迴應評論中的問題:

Windows使用UTF-16文件名和AFAIK使用UTF-16,在它的底層API,它的Java調用。但是,Windows控制檯非常破碎,並且不能很快支持UTF-8。

(Java也使用UTF-16在內部爲字符串對象)

OS X強制UTF-8編碼的文件名,所以創建文件名時的Java也應該尊重一點。

相關問題