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.
Vous devez vous connecter pour publier un commentaire.
L'encodage du Fichier-Entrées dans le ZIP est spécifiée à l'origine comme IBM la Page de Code 437. Le nombre de caractères utilisés dans d'autres langues sont impossibles à utiliser de cette façon.
La PKWARE-spécification fait référence à ce problème et ajoute un peu. Mais c'est un ajout ultérieur (à partir de 2007, grâce à Cheeso pour éclaircir cela, voir les commentaires). Si ce bit est défini, le nom de fichier d'entrée doivent être encodés en UTF-8. Cette extension est décrit dans l'ANNEXE D - Codage de Langue (EFS)", c'est à la fin du document lié.
Pour Java c'est un bug connu, d'avoir des ennuis avec les non-ASCII des caractères. Voir bug #4244499 et le nombre élevé de bugs en rapport.
Mon collègue utilisé comme solution de contournement URL-le Codage des noms de fichiers avant de les ranger dans le ZIP et le décodage de l'après leur lecture. Si vous contrôlez à la fois, de stockage et de lecture, qui peut être une solution de contournement.
EDIT: le bug quelqu'un suggère d'utiliser les ZipOutputStream de Apache Ant comme solution de contournement. Cette mise en œuvre permet la spécification d'un codage.
Dans des fichiers Zip, selon la spécification détenue par PKWare, l'encodage des noms de fichiers et les fichiers de commentaires est IBM437. En 2007 PKWare étendue de la spec pour permettre à l'UTF-8. Cela ne dit rien à propos de l'encodage des fichiers contenus dans le zip. Seul le codage des noms de fichiers.
Je pense que tous les outils et les bibliothèques (Java et non Java) soutien IBM437 (qui est un sur-ensemble de l'ASCII), et moins d'outils et de bibliothèques de support de l'UTF-8. Certains des outils et des libs soutien d'autres pages de code. Par exemple, si vous zip quelque chose à l'aide de WinRar sur un ordinateur exécutant à Shanghai, vous aurez la Big5 page de code. Ce n'est pas "autorisé" par le zip spec mais il arrive de toute façon.
La DotNetZip bibliothèque pour .NET ne Unicode, mais bien sûr cela ne vous aidera pas si vous utilisez Java!
En utilisant le Java prise en charge intégrée pour le ZIP, vous trouverez toujours IBM437. Si vous voulez une archive avec autre chose que IBM437, puis utiliser une bibliothèque tierce, ou de créer un JAR.
Miracles en effet se produire, et Sun/Oracle n'a vraiment fixer la longue vie de bug/rfe:
Il est maintenant possible de définir le nom de fichier lors de la création de codages le fichier zip/stream (nécessite Java 7).
Vous pouvez toujours utiliser l'Apache Commons mise en œuvre de la zip de flux : http://commons.apache.org/compress/apidocs/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.html#setEncoding%28java.lang.String%29
Appel setEncoding("UTF-8") sur votre stream devrait être suffisant.
À partir d'un rapide coup d'oeil à la TrueZIP manuel - ils recommandent le JAR format:
Cela signifie probablement que l'API est à l'aide de la java.util.zip pour sa mise en œuvre; que la documentation indique qu'il est encore en utilisant une format ZIP à partir de 1996. Support de l'Unicode n'est pas ajouté à la PKWARE .ZIP Spécification de Format de Fichier jusqu'en 2006.
Il n'a fait échouer ou était tout simplement une police problème? (par exemple, la police ayant différents glyphes pour ceux charcodes) j'ai vu des problèmes similaires dans Windows où le rendu "cassé", car la police ne prend pas en charge le jeu de caractères, mais les données ont été intact et de les corriger.
Non-ASCII noms de fichiers ne sont pas fiables à l'échelle de ZIP de mise en œuvre et sont à éviter. Il n'existe aucune disposition pour le stockage d'un paramètre charset dans les fichiers ZIP, les clients ont tendance à deviner avec "le système actuel de page de codes", ce qui est peu probable d'être ce que vous voulez. De nombreuses combinaisons de client et le code peut entraîner l'inaccessibilité des fichiers.
Désolé!