Wie kann ich ein ZIP-Archiv von Dateien mit hebräischen Namen korrekt dekomprimieren?


18

Jemand hat mir eine ZIP-Datei gesendet, die Dateien mit hebräischen Namen enthält (und unter Windows erstellt wurde, nicht sicher, mit welchem ​​Tool). Ich benutze LXDE auf Debian Stretch. Der Gnome-Archivmanager kann die Datei entpacken, aber die hebräischen Zeichen sind verstümmelt. Ich glaube, ich bekomme UTF-8-Oktette in Unicode-Zeichen erweitert, z. B. habe ich eine Datei, deren Name vier Zeichen und ein .doc-Suffic enthält, und die Zeichen sind: 0x008E 0x0087 0x008E 0x0085. Die Verwendung des Befehlszeilen-Dekomprimierungsprogramms ist noch schlimmer - es lehnt es ab, vollständig zu dekomprimieren, und beklagt sich über ein "ungültiges oder unvollständiges Multibyte- oder Breitzeichen".

Meine Fragen lauten also:

  • Gibt es ein anderes Dekomprimierungsprogramm, das meine Dateien mit den richtigen Namen dekomprimiert?
  • Stimmt etwas mit der Komprimierung der Datei nicht, oder ist es nur eine Inkompatibilität von ZIP-Implementierungen? Oder sogar Fehlfunktionen / Fehler der Linux-ZIP-Dienstprogramme?
  • Was kann ich tun, um die richtigen Dateinamen zu erhalten, nachdem ich sie mit den verstümmelten dekomprimiert habe?

Wenn Sie diese Bytes in der cp862-Tabelle nachschlagen, stimmt der Dateiname mit dem überein, was Sie erwarten? Kennen Sie ansonsten die native Codierung des Quellcomputers?
Michael Homer

Das Gleiche gilt für cp1255 und alle anderen plausiblen Codierungen. es kann möglich sein, es einfach basierend auf dem zu erarbeiten, was richtig aussieht.
Michael Homer

@MichaelHomer: Nein, es sieht nicht so aus, als würde es passen. Die systemeigene Codierung des Quellcomputers ist diejenige, die MS Windows verwendet, wenn Sie die regionalen Einstellungen auf Hebräisch-Israel festlegen. Ich vermute, es handelt sich also manchmal um UTF-8 und manchmal um CP1255.
einpoklum - wieder Monica

Antworten:


15

Es hört sich so an, als ob die Dateinamen in einer der proprietären Windows-Codepages ( CP862 , 1255 usw.) codiert sind .

  • Gibt es ein anderes Dekomprimierungsprogramm, das meine Dateien mit den richtigen Namen dekomprimiert? Mir ist kein Zip-Dienstprogramm bekannt, das diese Codepages nativ unterstützt. 7z versteht etwas von Codierungen, aber ich glaube, es muss sich um eine Codierung handeln, die Ihr System im Allgemeinen kennt (Sie wählen sie durch Festlegen der LANGUmgebungsvariablen), und Windows-Codepages gehören wahrscheinlich nicht dazu.

    unzip -UUsollten von der Befehlszeile aus arbeiten, um Dateien mit den richtigen Bytes im Namen zu erstellen (indem Sie die gesamte Unicode-Unterstützung deaktivieren). Dies ist wahrscheinlich der Effekt, den Sie bereits mit GNOME erzielt haben. Die Kodierung ist in beiden Fällen nicht richtig, aber wir können das unten beheben.

  • Stimmt etwas mit der Komprimierung der Datei nicht, oder ist es nur eine Inkompatibilität von ZIP-Implementierungen? Oder sogar Fehlfunktionen / Fehler der Linux-ZIP-Dienstprogramme? Die Datei, die Sie erhalten haben, wurde nicht portabel erstellt. Dies ist nicht unbedingt falsch für eine interne Verwendung, bei der die Kodierung fest und im Voraus bekannt ist, obwohl die Formatspezifikation besagt, dass Namen entweder UTF-8 oder cp437 sein sollen und Ihre auch nicht. Selbst zwischen Windows-Computern funktioniert die Verwendung verschiedener Codepages nicht gut, aber Nicht-Windows-Computer kennen diese Codepages von Anfang an nicht. Die meisten Tools codieren ihre Dateinamen in UTF-8 (was immer noch nicht ausreicht, um Probleme zu vermeiden).

  • Was kann ich tun, um die richtigen Dateinamen zu erhalten, nachdem ich sie mit den verstümmelten dekomprimiert habe? Wenn Sie die Kodierung der Dateinamen identifizieren können, können Sie die Bytes in den vorhandenen Namen in UTF-8 konvertieren und die vorhandenen Dateien an den richtigen Namen verschieben. Das convmvTool fasst diesen Prozess im Wesentlichen in einem einzigen Befehl zusammen: Es convmv -f cp862 -t utf8 -r .wird versucht, alles in .cp862 nach UTF-8 zu konvertieren .

    Alternativ können Sie iconvund verwenden find, um alles auf die richtigen Namen zu verschieben. Etwas wie:

    find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp862 -t utf8)"' sh {} \;
    

    findet alle Dateien unter dem aktuellen Verzeichnis und versucht, die Namen in UTF-8 umzuwandeln.

    In beiden Fällen können Sie mit verschiedenen Codierungen experimentieren und versuchen, eine zu finden, die Sinn ergibt.


Nachdem Sie die Kodierung für Sie behoben haben, können Sie das gleiche Problem am anderen Ende haben, wenn Sie diese Dateien in die andere Richtung zurücksenden möchten. In diesem Fall können Sie den Vorgang umkehren, bevor Sie die Dateien komprimieren -UU, da es auf Windows-Seite wahrscheinlich sehr schwierig ist, den Fehler zu beheben.


Ich denke, das muss geschehen, da die ZIP-Datei, in der ich gesucht habe, nicht mehr vorhanden ist. Gründe, die hier nicht relevant sind. Danke, mache das nächste Mal und hoffe auf das Beste.
einpoklum - wieder Monica

1
raroder sich p7zipweigern, ZIP-Archive zu verarbeiten. Gibt es eine Möglichkeit, ein Archiv mit Dateinamen in proprietären Codierungen unter Linux zu extrahieren? Wenn ich mit extrahiere unzip, erhalte ich eine Fehlermeldung: "Fehler: ╨и╨ / Ship_╨п kann nicht erstellt werden ▓╨Ю╨┤╨╜╨╛╨╣ ╨Ъ╨╜╨╕╨╢╨║╨╡! .Png Dateiname zu lang "
Nickolai Leschov

Ich habe es geschafft, die .zip-Datei korrekt zu extrahieren LANG=ru_RU.CP1251; unzip Bleed.zip(in meinem Fall war es die kyrillische Kodierung). Jetzt frage ich mich, wie ich mein System so einrichten kann, dass ich solche .zip-Dateien standardmäßig in der GUI korrekt öffnen kann.
Nickolai Leschov

@NickolaiLeschov Stellen Sie eine Frage und jemand kann Ihnen helfen. Möglicherweise müssen Sie weitere Informationen zu Ihrem System bereitstellen.
Michael Homer

unzip -UU foo.ziparbeitete für türkische Charaktere
Mert S. Kaplan

8

Ich hatte Erfolg mit dem Befehl 7z x <source.zip>.

Ausführung:

p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,[...])

Potenziell relevantes Umfeld:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_CTYPE=UTF-8

Es war in der Lage, alle Dateien mit 8-Bit-Zeichen in ihren Dateinamen zu dekomprimieren, wobei einige dieser Zeichen übersprungen und andere verstümmelt wurden.


p7zip ist der einzige, der für mich gearbeitet hat
alex88

6

Ich hatte gerade das gleiche Problem und es stellte sich heraus, dass meine Version unzipvon Ubuntu Repositories ( UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.) die automatische Dekodierung von Dateinamen handhaben kann, wenn Sie den -aSchalter angeben .

unzip -a stupid.zip

+1 obwohl ich momentan nichts zu testen habe.
einpoklum - wieder Monica

1
Laut Manpage kümmert sich unzipder -aSwitch um das Konvertieren von Textdateien. Keine Dateinamen.
Berühmte

@beruic, ich hatte Unicode-Nummern als Dateinamen entpackt (# U + 0040 # U + 0050 ...) und dann hat "unzip -a" wirklich geholfen.
Chang Zhao

1
Ich habe es mit Manga versucht. Die Dateinamen wurden korrekt dekodiert, aber die Bilder wurden auch als Text (!) Interpretiert und vollständig beschädigt. Es interpretiert sogar zip- und rar-Dateien im Archiv als Text, die Erkennung ist völlig nutzlos.
rjh

2

Ich hatte ein ähnliches Problem beim Entschlüsseln eines Zip-Archivs mit kyrillischen Zeichen. Ein einzeiliges Python-Skript erledigte die Aufgabe ordnungsgemäß:

#!/usr/bin/python

import zipfile
import sys

zipfile.ZipFile(sys.argv[1], 'r').extractall(sys.argv[2] if len(sys.argv) > 2 else '.')

Dann ruf es einfach an unzip_encund ruf es anunzip_enc ZIP_FILE [TARGET_DIR]

Für mich weder unzip -UU, unzip -anoch LANG*taten Umgebungsvariablen etwas Gutes.


Ich werde das nächste Mal versuchen, wenn ich eine solche Zip-Datei extrahieren muss ... danke. Aber - können Sie Ihr Skript ändern, um: 1. zu prüfen, ob zwei Argumente vorhanden sind 2. in das aktuelle Arbeitsverzeichnis zu extrahieren, wenn nur die ZIP-Datei bereitgestellt wird?
Einpoklum - Wiedereinstellung von Monica

2

Ich hatte Glück mit dieser Kombination:

export LANG=es_MX 
7z x file.zip
convmv -f cp437 -t utf8 -r .

add --notest to convmv für die tatsächliche Umbenennung. Später habe ich eine noch bessere Version gefunden:

LANG=es_MX.cp437 unzip -UU file.zip
convmv -f cp437 -t utf8 -r . --notest

+1 nur für convmv und das Kommandozeilen-Tool 7zip.
einpoklum - wieder Monica

Wahrscheinlich hat man verschiedene Möglichkeiten , um zu versuchen LANGvariabel und von Codieren auf die Datei in der Hand abhängig. Ich habe eine Datei, in der LANG=ru_RU.CP1251zusammen mit -f cp866gearbeitet wurde.
Dmitri Chubarov

0

Ich habe das zip-Archiv unter Linux (von der Kommandozeile aus) komprimiert und Dateinamen mit diakritischen Zeichen werden unter Windows nicht korrekt dekomprimiert, aber ich habe es erfolgreich mit der Bandizip- Software entpackt, die den Zeichensatz in der Symbolleiste festlegen kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.