¿Cuál es la mejor manera de añadir no ASCII nombres de archivo en un archivo postal usando Java, de tal manera que los archivos pueden ser correctamente leídos ambos Windows y Linux?Añadir nombres de archivo no ASCII a zip en Java
Aquí hay un intento, adaptado de https://truezip.dev.java.net/tutorial-6.html#Example, que funciona en Windows Vista pero falla en Ubuntu Hardy. En Hardy, el nombre del archivo se muestra como abc-ЖДФ.txt en el archivo-rodillo.
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();
}
}
}
diferencia de java.util.zip, TrueZIP permite especificar archivo zip codificación. Aquí hay otra muestra, esta vez especificando explícitamente la codificación. Ni IBM437, UTF-8 ni ISO-8859-1 funcionan en Linux. IBM437 funciona en 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 con UTF-8 trabajado para mí en Windows 7 y mac os x 10.6.x. Todavía no funciona en Linux? –
Hubo un error de larga data, 9 años en existencia, en JDK anterior a la versión 7 que impedía el manejo correcto de nombres de archivos con nombres que no podían codificarse con IBM CP437. http://bugs.sun.com/bugdatabase/view_bug.do?bug%5Fid=4244499 Aparentemente se ha corregido en JDK7. https://blogs.oracle.com/xuemingshen/entry/non_utf_8_encoding_in Por lo tanto, una solución parece ser, use JDK7 y los nuevos constructores para ZipInputStream, ZipOutputStream y ZipFile. – Cheeso