Codierung von kyrillischen Dateinamen in Zip-Dateien

8

Hier gibt es einige Fragen zu Nicht-ASCII-Buchstaben in den Namen von Dateien, die als Streams in Zip-Dateien gespeichert sind ( Hebräisch , Chinesisch , Japanisch oder Koreanisch ). Keine der angebotenen Lösungen half mir jedoch bei einer Zip-Datei mit kyrillischen Buchstaben, die von einem Windows-Computer stammte.

Die Datei hat selbst einen kyrillischen Namen ( Космос.zip - Link zum Herunterladen). Dies ist ein Archiv mit Inhalten von null Länge, nur zur Veranschaulichung.

unzip -l Drucke:

Archive:  Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   ɫ���߼��/ict_inf.pdf
---------                     -------
        0                     1 file

Das Hässliche ɫ���߼��steht für die Folge von Bytes C9 AB DF E8 AB DF BC AB DF.

Ich weiß (mithilfe der GMail-Vorschaufunktion), dass dies sein sollte

Archive:  Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

Das heißt , wir müssen Karte C9 AB DF E8 AB DF BC AB DFzu РосКосмос.

Es gibt mehrere häufig verwendete kyrillische 8-Bit-Codierungen: CP1251, CP866, ISO8859-5, jedoch würde dieses Wort als eine andere Folge von Bytes codiert:

           Р  о  с  К  о  с  м  о  с
CP866:     90 AE E1 8A AE E1 AC AE E1
CP1251:    D0 EE F1 CA EE F1 EC EE F1
ISO8859-5: C0 DE E1 BA DE E1 DC DE E1

Offensichtlich würde keine der üblicherweise verwendeten kyrillischen 8-Bit-Codierungen die Eingangsnamen in die Ausgangsnamen wie diese decodieren. Hier ist etwas Komplizierteres am Werk.

Wenn wir nur wüssten, wie man die Namen dekodiert, wäre das Umbenennen der Dateien nach dem Extrahieren mit einem geeigneten findSkript ( https://unix.stackexchange.com/a/252000/17649 ) einfach , z

find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | here-goes-the-decoding pipeline )"' sh {} \;

oder das Dienstprogramm convmv .

Dmitri Chubarov
quelle

Antworten:

1

Ihre ZIP-Datei, die mit einem "aktuellen" Infozip verwendet wird, zeigt die richtigen Dateinamen an:

unzip -l Russian-Космос.zip 
Archive:  Russian-Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

Beim Entpacken wird das РосКосмос/Verzeichnis beim Entpacken korrekt erstellt .

UTF-8-Unterstützung wurde vor langer Zeit zu infozip hinzugefügt. Ausführbare Dateien auf meinem Ubuntu:

UnZip 6.00, 20 April 2009
Zip 3.0,  July 5th 2008

Ihr Problem kann also eine alte InfoZip-Version sein (oder eine Version, die ohne UTF-8-Unterstützung kompiliert wurde).

In meiner Version strings /usr/bin/unzip | grep -A8 -B8 'UTF-8'ergibt sich unter anderem:

ZIP64_SUPPORT (archives using Zip64 for large files supported)
LARGE_FILE_SUPPORT (large files over 2 GiB supported)
other
UTF-8
UNICODE_SUPPORT [wide-chars, char coding: %s] (handle UTF-8 paths)
USE_DEFLATE64 (PKZIP 4.x Deflate64(tm) supported)
USE_UNSHRINK (PKZIP/Zip 1.x unshrinking method supported)

Dies scheint mit Kompilierungs- / Build-Optionen zu tun zu haben

Xenoid
quelle
Interessant, es ist nicht für mich arbeiten. Ich verwende das gleiche Info-ZIP UnZip 6.00, jedoch aus der OpenSUSE-Distribution. Werde untersuchen.
Dmitri Chubarov
Die UTF-8-Unterstützung ist eine Option zur Kompilierungszeit, die möglicherweise in Ihrer Distribution nicht verwendet wird. Siehe meine bearbeitete Antwort.
Xenoid
Ich habe es nicht getestet, aber ich habe den Eindruck, dass das Problem durch das seit dem 24. Januar 2002unzip-iso8859_2.patch auf OpenSUSE-Pakete entpackte Unzip verursacht wird . Wird wahrscheinlich einen Fehlerbericht einreichen.
Dmitri Chubarov
1
Sollte nicht zu schwer sein, deine eigenen neu zu kompilieren ...
Xenoid
2

Ich habe im OpenNET.ru-Forum eine Lösung gefunden, einer beliebten russischsprachigen Ressource, die sich seit 1996 Open-Source-Software und -Technologien widmet. Ein Beitrag auf OpenNET schlägt vor, dass Info-ZIP einst eine beliebte Sammlung von Tools für den Umgang mit ZIP war Archive auf Computern unter MS-DOS gingen davon aus, dass unter MS-DOS nur eine 8-Bit-Codierung vorhanden ist, nämlich CP850. Daher werden alle Dateinamen automatisch durch CP850->CP1252Konvertierung ausgeführt. CP1252 wurde wahrscheinlich als beliebteste Annäherung an die ISO-8859-1-Zeichensatzcodierung ausgewählt.

Daher wäre der richtige Suchbefehl, der nach dem Extrahieren eines Archivs mit kyrillischen Dateinamen ausgeführt werden soll

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

Interessanterweise kann man Vorschläge finden, nicht CP1252, sondern ISO-8859-1 zu verwenden. Dies scheint nicht der Fall zu sein, da einige der Archive, bei denen ich auf die Transformation gestoßen bin, iconv -f iso8859-1 -t cp850bei iconv -f cp1252 -t cp850erfolgreicher Konvertierung fehlgeschlagen sind .

Zurück zu einzelnen Charakteren

           Р  о  с  К  о  с  м  о  с
CP866:     90 AE E1 8A AE E1 AC AE E1

Wenn Sie nun CP850 -> CP1252 anwenden, erhalten Sie C9 AB DF E8 AB DF BC AB DF. Genau die Sequenz, die wir beobachtet haben.

Ein weiterer nützlicher Befehl wäre

 unzip -l РосКосмос.zip | grep -aEv '^Archive:' | iconv -f iso8859-1 -t cp850 | iconv -f cp866

Um eine Liste der Dateien aus dem Archiv zu erhalten

 Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

Das Herausfiltern der Zeile, mit der begonnen wird, Archive:ist ein Schutz, um den Namen des Archivs vor der Konvertierung zu verbergen.

Dmitri Chubarov
quelle