comment ouvrir un programme en java fichier zip généré en utilisant l'encodage UTF-8

Notre produit possède une fonction d'exportation, qui utilise ZipOutputStream pour compresser un répertoire; toutefois, lorsque vous essayez de compresser un répertoire qui contient les noms de fichiers avec les Chinois ou les Japonais de caractère à l'exportation ne fonctionne pas correctement. Pour une raison quelconque, les nouveaux fichiers dans le fichier zip sont nommés différemment. Voici un exemple de nos compression code:

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
out.setEncoding("UTF-8");
//program to add directory to zip 
//program add/create file to zip
out.close();

Mon algorithme d'importation, également construit en Java, pouvez importer le fichier zippé correctement, même si elle contient des Chinois/Japonais caractères dans les noms de fichiers.

 Zipfile zipfile = new ZipFile(zipPath, "UTF-8");
 Enumeration e = zipFile.getEntries();
 while (e.hasMoreElements()) {
 entry = (ZipEntry) e.nextElement();
 String name = entry.getName();
         ....

Est le logiciel zip du programme de la difficulté de décompression de la codé en UTF-8 fichiers, ou est-il quelque chose de spécial pour créer un fichier zip qui peut être facilement utilisé par les logiciels existants en utilisant l'encodage utf-8??


J'ai écrit un programme exemple:

package ZipFile;
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 ZipFolder{
public static void main(String[] a) throws Exception
{
String srcFolder = "D:/9.4_work/openscript_repo/中文124.All/中文";
String destZipFile = "D:/Eclipse_Projects/OpenScriptDebuggingProject/src/ZipFile/demo.zip";
zipFolder(srcFolder, destZipFile);
}
static public void zipFolder(String srcFolder, String destZipFile) throws Exception
{
ZipOutputStream zip = null;
FileOutputStream fileWriter = null;
fileWriter = new FileOutputStream(destZipFile);
zip = new ZipOutputStream(fileWriter);
zip.setEncoding("UTF-8");
//using GBK encoding, the chinese name can be correctly displayed when unzip
//zip.setEncoding("GBK");
addFolderToZip("", srcFolder, zip);
zip.flush();
zip.close();
}
static private void addFileToZip(String path, String srcFile, ZipOutputStream zip) throws Exception
{
File folder = new File(srcFile);
if (folder.isDirectory()) {
addFolderToZip(path, srcFile, zip);
}
else {
byte[] buf = new byte[1024];
int len;
FileInputStream in = new FileInputStream(srcFile);
zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));
while ((len = in.read(buf)) > 0) {
zip.write(buf, 0, len);
}
}
}
static private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception
{
File folder = new File(srcFolder);
for (String fileName : folder.list()) {
if (path.equals("")) {
addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip);
}
else {
addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip);
}
}
}

}

La compression Zip ne se soucie pas de codage, car il fonctionne uniquement sur des octets, de sorte que vous ne devriez pas avoir à vous soucier de codages jusqu'à ce que le chargement de données dans une Chaîne de caractères ou l'ouverture d'extraire les fichiers dans un éditeur de texte. Ce ZipOutputStream classe est-ce? java.util.zip.ZipOutputStream n'a pas de setEncoding méthode.
Dans mon système windows 7, si j'utilise ".setEncoding("GBK"); " le fichier zip généré peut être correctement ouvert avec le nom Chinois correctement affiché par 7zip.
org.apache.outils.zip.ZipOutputStream; java.util.zip.ZipOutputStream semble ne pas avoir de support d'encodage
Je sais que la compression zip ne se soucie pas de l'encodage du contenu, mais zip poignées de codage sur nom de fichier et le dir nom, et mes problèmes avec nom lors de la décompression, pas le contenu.
Ah ok, j'avais pas compris que c'était sur les noms de fichiers plutôt que le contenu. Maintenant, je comprends.

OriginalL'auteur Ben Xu | 2011-06-07