Erstellen tar-Archiv mit nationalen Zeichen in Java
-
18-09-2019 - |
Frage
Haben Sie eine Bibliothek / Art und Weise in Java wissen tar-Archiv mit Dateinamen in der richtigen Fenster nationalen Zeichensatz (zB CP1250) zu erzeugen.
Ich habe versucht, mit Java tar , Beispielcode:
final TarEntry entry = new TarEntry( files[i] );
String filename = files[i].getPath().replaceAll( baseDir, "" );
entry.setName( new String( filename.getBytes(), "Cp1250" ) );
out.putNextEntry( entry );
...
Es funktioniert nicht. Umlaute sind gebrochen, wo ich Teer in den Fenstern zu extrahieren. Ich habe auch festgestellt, eine seltsame Sache, unter Linux polnischen National Zeichen gezeigt werden nur korrekt, wenn ich verwendet ISO-8859-1:
entry.setName( new String( filename.getBytes(), "ISO-8859-1" ) );
Trotz der Tatsache, dass die richtige polnische Zeichensatz ISO-8859-2, nicht zu arbeiten. Ich habe auch CP852 für Fenster, keine Wirkung versucht.
Ich weiß, dass die Grenzen des tar-Format, aber es ändert, ist keine Option.
Vielen Dank für die Anregungen,
Lösung
Offiziell hat TAR keine Nicht-ASCII in Header unterstützen. Allerdings konnte ich UTF-8 kodierten Dateinamen auf Linux verwenden.
Sie sollten dies versuchen,
String filename = files[i].getName();
byte[] bytes = filename.getBytes("Cp1250")
entry.setName(new String(bytes, "ISO-8859-1"));
out.putNextEntry( entry );
Das zumindest bewahrt das Bytes in CP1250 in TAR-Header.
Andere Tipps
tar erlaubt keine Nicht-ASCII-Wert in seinem Header. Wenn Sie eine andere Codierung versuchen, ist das Ergebnis wahrscheinlich bis zu dem, was die Zielplattform entscheidet mit den Byte-Werten zu tun. Es Art von klingt wie Ihre Zielplattform Programm tar ist die Bytes als ISO-8859-1 zu interpretieren, weshalb die ‚funktioniert‘.
Haben Sie einen Blick auf die erweiterten Attribute? http://www.freebsd.org/ cgi / man.cgi? query = tar & Sektion = 5 & manpath = FreeBSD + 8-Strom
Ich bin kein Experte hier aber das scheint die einzige offizielle Weg, um alle Nicht-ASCII-Werte in einer tar-Datei-Header zu setzen.