Normalerweise werden nach der Verwendung von Java zum Packen von Dateien und Generieren komprimierter Dateien verstümmelte Zeichen an den folgenden zwei Stellen angezeigt:
1. Das Problem des verstümmelten Inhalts in China gibt es im Internet. Es gibt zwei Hauptmethoden: Die eine besteht darin, den Quellcode von Sun zu ändern, und die andere besteht darin, die Open-Source-Klassenbibliothek org.apache zu verwenden .tools.zip.ZipOutputStream und org.apache.tools.zip.ZipEntry, diese beiden Klassen sind in ant.jar enthalten und können direkt heruntergeladen und verwendet werden. Es besteht kein Zweifel, dass es bequemer ist, Letzteres zu wählen.
2. Das Problem verstümmelter chinesischer Zeichen in komprimierten Dateikommentaren: zos.setComment("Chinese test"); Es gibt online weniger Informationen zur Lösung dieses Problems. Es gab keine Probleme mit den vom Projekt erstellten Testklassen auf meinem eigenen Computer, aber bei der Verwendung in den Projekten des Unternehmens traten immer wieder verstümmelte Zeichen auf. Durch die Verwendung der Methode zum Festlegen der Kodierung (zos.setEncoding("gbk");), Ich habe das Problem schließlich im Testprojekt gefunden. Die Codierungsmethode ist gbk und die Standardcodierung des Unternehmensprojekts ist utf-8. Es gibt also kein Problem mit dem Testprojekt, aber es gibt ein Problem mit dem Unternehmensprojekt.
org.apache.tools.zip.ZipOutputStream verwendet standardmäßig die Kodierungsmethode des Projekts. Theoretisch unterstützt utf-8 auch Chinesisch. Ich kann wirklich nicht herausfinden, warum es immer noch verstümmelt ist. Sie können es lösen, indem Sie die setEncoding ändern Methode zu GBK.
Der Beispielcode für das obige Problem lautet wie folgt:
Paket com.compress;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import org. apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream; public class CompressEncodingTest { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { File f = new File("Chinese test. txt"); ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream( new FileOutputStream("zipTest.zip"), 1024)); zos.putNextEntry(new ZipEntry("Chinese.txt")); DataInputStream(new BufferedInputStream( new FileInputStream(f))); ZipEntry(f.getName())); int c; while ((c = dis.read()) != -1) { zos.write(c); zos.setEncoding("gbk"); ; }}