2010-11-18 2 views
2

Ich möchte eine ZIP-Datei mit Java (jdk, ant.jar oder commons-compress) erstellen..zip-Datei, die von Java erstellt wurde, unterstützt kein Chinesisch (utf-8)

Aber wenn der ZipEntry Name nicht-Englisch (zB Chinesisch, Japanisch) enthält, wird unlesbarer Code in WinRAR oder Windows Compress angezeigt (commons-compress korrekt in WinRAR angezeigt).

Wer kann mir helfen !!!

+0

Sicher ist es nicht nur ein Problem mit dem Programm ist, um die Dateien anzuzeigen, verwenden? Das Zippen von etwas sollte nicht vom Zeichensatz abhängig sein. – Armand

+0

@Alison, es tut. Der Dateiname charset variiert. –

Antwort

2

Sie haben einen der Top 25 java bug getroffen.

Gute Nachricht ist, dass dies bereits gelöst ist. Schlechte Neuigkeiten es ist nur in JDK7 behoben. Siehe this entry für Details.

Alternativ können Sie Arcmexer (nur gelesen) verwenden.

+0

Es sagt JDK 7 im Blog Post. –

+0

behoben. und fügte eine Alternative hinzu. –

+0

Vielen Dank. Ich kann zwar immer noch keine Lösung finden, aber vielleicht kann das meinen Vorgesetzten lösen.^_ ^ –

0

Werfen Sie einen Blick auf 7-Zip-JBinding es ist ein Java-Wrapper für 7zip.

1

versuchen, diese von Apache Commons verwenden, komprimiert

import java.io.*; 
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; 
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; 
public class ZipFiles { 
    public static void main(String[] args) throws Exception{ 
     ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(new FileOutputStream("测试.zip")); 
     zipOut.setEncoding("Cp437"); // This should handle your "special" characters 
     zipOut.setFallbackToUTF8(true); // For "unknown" characters! 
     zipOut.setUseLanguageEncodingFlag(true);        
     zipOut.setCreateUnicodeExtraFields(
     ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE); 
     zipOut.putArchiveEntry(new ZipArchiveEntry("测试.xml")); 
     zipOut.putArchiveEntry(new ZipArchiveEntry("test.xml")); 
     zipOut.closeArchiveEntry(); 
     zipOut.flush(); 
     zipOut.close(); 
    } 
}