Ajouter les non-ASCII des noms de fichier zip en Java

Quelle est la meilleure façon d'ajouter de la non-ASCII les noms de fichiers à un fichier zip à l'aide de Java, de telle manière que les fichiers puissent être correctement lue dans les deux Windows et Linux?

Ici est une tentative, adapté de https://truezip.dev.java.net/tutorial-6.html#Example, qui fonctionne sous Windows Vista, mais échoue dans Ubuntu Hardy. Dans Hardy le nom de fichier est affiché comme abc-ЖДФ.txt file-roller.

import java.io.IOException;
import java.io.PrintStream;

import de.schlichtherle.io.File;
import de.schlichtherle.io.FileOutputStream;

public class Main {

    public static void main(final String[] args) throws IOException {

        try {
            PrintStream ps = new PrintStream(new FileOutputStream(
                    "outer.zip/abc-åäö.txt"));
            try {
                ps.println("The characters åäö works here though.");
            } finally {
                ps.close();
            }
        } finally {
            File.umount();
        }
    }
}

Contrairement à java.util.zip, truezip permet de spécifier le fichier zip de l'encodage. Voici un autre exemple, cette fois explicitement spécifier l'encodage. Ni IBM437, UTF-8 et ISO-8859-1 fonctionne sous Linux. IBM437 fonctionne dans Windows.

import java.io.IOException;

import de.schlichtherle.io.FileOutputStream;
import de.schlichtherle.util.zip.ZipEntry;
import de.schlichtherle.util.zip.ZipOutputStream;

public class Main {

    public static void main(final String[] args) throws IOException {

        for (String encoding : new String[] { "IBM437", "UTF-8", "ISO-8859-1" }) {
            ZipOutputStream zipOutput = new ZipOutputStream(
                    new FileOutputStream(encoding + "-example.zip"), encoding);
            ZipEntry entry = new ZipEntry("abc-åäö.txt");
            zipOutput.putNextEntry(entry);
            zipOutput.closeEntry();
            zipOutput.close();
        }
    }
}
  • truezip avec l'encodage UTF-8 a fonctionné pour moi sur windows 7 et mac os x 10.6.x. Cela ne fonctionne toujours pas sous Linux?
  • Il y avait un bug de longue date - 9 ans d'existence - dans le JDK avant la v7 qui a empêché la manipulation correcte des noms de fichier avec des noms qui n'ont pu être codés avec IBM CP437. bugs.sun.com/bugdatabase/view_bug.do?bug%5Fid=4244499 Il a apparemment été corrigé dans JDK7. blogs.oracle.com/xuemingshen/entry/non_utf_8_encoding_in par conséquent, une solution semble être, à l'utilisation JDK7 et les nouveaux constructeurs pour ZipInputStream, ZipOutputStream, et ZipFile.
InformationsquelleAutor Micke | 2008-09-19