ZIP mit der angegebenen Kodierung dekomprimieren

24

Ich habe ZIP-Datei (en), die Dateien enthält, deren Dateinamen in einer bestimmten Codierung vorliegen. Angenommen, ich kenne die Kodierung dieser Dateinamen, weiß aber noch nicht, wie ich sie richtig dekomprimieren soll.

Es folgt ein Beispieldatei enthält es eine Datei "【SSK字幕组】 The Vampire Diaries吸血鬼日记S06E12.ass"

Ich weiß, dass die verwendete Kodierung GB18030 ist (Chinesisch)

Die Frage ist, wie man diese Datei in FreeBSD mit unzip oder einem anderen CLI-Dienstprogramm entpackt, um den richtigen kodierten Dateinamen zu erhalten. Ich habe alles versucht, was ich konnte, aber das Ergebnis war nie gut. Bitte helfen Sie.

Ich habe es mit OSX versucht:

MBP1:test 2ge$ bsdtar xf gb18030.zip
MBP1:test 2ge$ ls
%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12/      gb18030.zip
MBP1:test 2ge$ cd %A1%BESSK%D7%D6Ļ%D7顿The\ Vampire\ Diaries\ %CE%FCѪ%B9%ED%C8ռ%C7S06E12/
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ ls
%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12.ass*
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ find . | iconv -f gb18030 -t utf-8
.
./%A1%BESSK%D7%D6L抬%D7椤縏he Vampire Diaries %CE%FC血%B9%ED%C8占%C7S06E12.ass 
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ convmv -r -f gb18030 -t utf-8 --notest .
Skipping, already UTF-8: ./%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12.ass
Ready!

Ich habe es mit unzip ähnlich versucht, aber ich bekomme ein ähnliches Problem.

Danke, probiere jetzt FREE BSD aus, bei dem ich eine Verbindung über SSH von OSX (Terminal) herstelle:

# locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=C

Das erste, was ich möchte, ist, chinesische Namen zu zeigen. ich habe mich verändert

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

Dann habe ich die Datei heruntergeladen und versuche "ls" um richtige Charaktere zu sehen, aber kein Glück. Ich denke, ich muss zuerst das chinesische Gebietsschema lösen, um zu überprüfen, ob ich das richtige Ergebnis erhalte. Eigentlich kann ich es vergleichen. Kannst du mir bitte auch dabei helfen?

2ge
quelle

Antworten:

21

Hier ist, was ich unter Ubuntu 16.04 mache, um eine Zip-Datei in einer beliebigen Codierung zu entpacken, solange ich weiß, was diese Codierung ist. Dieselbe Methode sollte unter FreeBSD funktionieren, da sie nur auf allgemein verfügbaren unzipTools basiert .

  1. Ich überprüfe den genauen Namen der Kodierung, um sie nicht falsch zu schreiben: https://www.iana.org/assignments/character-sets/character-sets.xhtml

  2. Ich renne einfach

    $ unzip -O <encoding> <filename> -d <target_dir>
    

    oder

    $ unzip -I <encoding> <filename> -d <target_dir>
    

    wähle zwischen -Ooder -Inach Anleitung hier:

    $ unzip -h
    UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
      ...
      -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
      -I CHARSET  specify a character encoding for UNIX and other archives
      ...
    

    was bedeutet, dass ich es einfach versuche -Ound es sollte funktionieren, da nicht viele Leute eine .zipDatei in Unix erstellen würden ...


Also, für Ihr konkretes Beispiel:

  1. Der genaue Codierungsname lautet GB18030.

  2. Ich benutze die -OFlagge und:

    $ unzip -O GB18030 gb18030.zip -d target_dir
    Archive:  gb18030.zip
       creating: target_dir/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/
      inflating: target_dir/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12.ass
    

    ... Es klappt.

mbdevpl
quelle
Für von griechischem Windows erstellte Reißverschlüsse hatte ich Erfolg mit dieser Methode und Codierung von CP737
ndemou
Bravo! Ich habe die Manpage doppelt überprüft, sie funktioniert tatsächlich, aber völlig undokumentiert. Keine der zsh-Vervollständigungen hat diesen Parameter.
TTIMASDF
2
unziphat diese Option in Mac OS X nicht und erstellt immer prozentual codierte Dateinamen. @ Javacoms unarVorschlag wirkte wie ein Zauber.
Phil Krylov
Sieht aus wie eine Debian-spezifische Funktionalität. Ich unzipsage es UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielerund biete solche Optionen nicht an.
L29Ah,
1
@ L29Ah Mein unzipin Debian 9 ist genau die gleiche Version und hat keine solchen Optionen. Wahrscheinlich Ubuntu-spezifisch?
Arnie97
11

Bei den meisten POSIX-Dateisystemen besteht der Dateiname nur aus einer Reihe von Bytes, und es liegt im Ermessen des Benutzers, einen Sinn daraus zu ziehen. Sie können dies zu Ihrem Vorteil nutzen.

  1. Extrahieren Sie zuerst das Archiv mit bsdtar, da das unzipTool die Dateinamen zu entstellen scheint, während bsdtar sie roh extrahiert. (Ich teste dies unter Linux. Ich denke, FreeBSD nennt es einfach tar.)

    $ bsdtar xf gb18030.zip
    
  2. Stellen Sie sicher, dass Tools wie iconvdie Namen erfolgreich dekodieren können:

    $ find . | iconv -f gb18030 -t utf-8
    

    (Beachten Sie, dass dies nur die findAusgabe betrifft , nicht die Dateien selbst.)

  3. Verwenden Sie schließlich convmv, um die Dateinamen in UTF-8 umzuwandeln:

    $ convmv -r -f gb18030 -t utf-8 --notest .
    

    (Hinweis: Ich musste Encode :: HanExtra von CPAN für die GB18030-Unterstützung installieren und manuell use Encode::HanExtra;zu / usr / bin / convmv hinzufügen, obwohl dies erforderlich war

  4. Falls convmvnicht verfügbar, schreiben Sie es:

    $ find . -depth | while read -r old; do
        old=./$old;
        head=${old%/*};
        tail=${old##*/};
        new=$head/$(echo "$tail" | iconv -f gb18030 -t utf-8);
        [ "$old" = "$new" ] || mv "$old" "$new";
    done
    

    (Zumindest unter Linux hat dies den Vorteil, dass iconves fast immer verfügbar ist und immer gb18030 unterstützt.)

user1686
quelle
danke grawity schau dir das an. Ich teste gerade unter OSX (aber das kommt FreeBSD sehr nahe, und ich denke, das Ergebnis wird ähnlich sein). Kommentar zu meiner Frage hinzufügen, kann hier nicht bearbeitet werden ...
2ge
1
@ 2ge: Ah, OSX kann tatsächlich ganz anders aussehen, da HFS + Dateinamen intern in NFD UTF-16 zwingt, anstatt Byte-Strings zu speichern. Daher besteht die Möglichkeit, dass die GB18030-Namen beschädigt werden, bevor Sie sie konvertieren können.
user1686
Ich habe die ursprüngliche Frage bearbeitet und weitere Kommentare hinzugefügt.
2.
Ja, ich habe es auf macOS Sierra ausprobiert und bsdtar hat viele "Fehler beim Erstellen von xxx" -Fehlern gemeldet (da die Namen der übergeordneten Verzeichnisse stimmen). Musste mein Archiv auf ein Linux VPS kopieren, es mit unzip -O extrahieren und das Ergebnis mit ssh-C auf meinen Mac zurückkopieren.
Chang Qian
10

Methode 1 : verwenden Sie Unar-Dienstprogramm

sudo apt-get install unar

unar -e gb18030 gb18030.zip

Methode 2 : Verwenden Sie ein Python-Skript zum Entpacken der Datei (siehe https://gist.github.com/usunyu/dfc6e56af6e6caab8018bef4c3f3d452#file-gbk-unzip-py )

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# unzip-gbk.py

import os
import sys
import zipfile
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--encoding", help="encoding for filename, default gbk")
parser.add_argument("-l", help="list filenames in zipfile, do not unzip", action="store_true")
parser.add_argument("file", help="process file.zip")
args = parser.parse_args()
print "Processing File " + args.file

file=zipfile.ZipFile(args.file,"r");
if args.encoding:
    print "Encoding " + args.encoding
for name in file.namelist():
    if args.encoding:
        utf8name=name.decode(args.encoding)
    else:
        utf8name=name.decode('gbk')
    pathname = os.path.dirname(utf8name)
    if args.l:
        print "Filename " + utf8name
    else:
        print "Extracting " + utf8name
        if not os.path.exists(pathname) and pathname!= "":
            os.makedirs(pathname)
        data = file.read(name)
        if not os.path.exists(utf8name):
            fo = open(utf8name, "w")
            fo.write(data)
            fo.close
file.close()

Das Beispiel gb18030.zip extrahiert die folgende Datei

【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12
【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12.ass
javacom
quelle
2
Vielen Dank, die unarMethode ist zumindest unter Mac OS X die stressfreieste.
Phil Krylov
4

Unter OS X können Sie eine GUI-Anwendung namens The Unarchiver verwenden . Es kann mit Mac App Store oder Homebrew Cask installiert werden :

brew cask install the-unarchiver

Wenn Sie eine ZIP-Datei damit öffnen, können Sie die entsprechende Codierung mithilfe der Vorschau eines Dateinamens aus dem Archiv auswählen.

Melebius
quelle
4

7z unterstützt Zeichensatz-ID mit einem Schalter -scs, zB:

7z x -scs903 some.zip

Wobei 903 中文 中文 Zeichensatz ist. Eine längere Liste der Zeichensatz-IDs finden Sie hier .

Oh ho
quelle
2
7z -scsswitch wählt nur die Kodierung der @-definierten Dateiliste.
Phil Krylov
1

Verwenden Sie 7z, um die Datei zu extrahieren

7z x yourfile.zip

Danach konvertieren Sie die Kodierung dieser Dateinamen selbst:

convmv --notest -f from_encoding -t utf-8 -r your_extracted_folder/

Dies funktioniert für mich. From_encoding in meinem Fall ist tis-620 (das ist eine thailändische Codierung), Sie müssen eine geeignete Codierung für Ihre Sprache finden. Ein beliebtes Programm löst normalerweise das Problem, aber wenn der Dateiname immer noch nicht lesbar ist, können Sie versuchen, die Codierung von "from_encoding" auf "windows-1252" oder "shift-jis" (Japanisch) zu ändern.

convmv --list
iconv --list

Dies ist für mich eine sehr einfache Methode zum Lösen.

off99555
quelle
-1

Ich habe gerade 7zip verwendet und es ist mir gelungen, die richtige Kodierung zu finden.

(etwas, das Standardreißverschluss nicht konnte)

aber verwendet es unter Windows, mit dem GUI-Tool. Vielleicht funktioniert die Kommandozeile 7z auch für Sie.

Berry Tsakala
quelle
Es gibt eine Antwort, die 7z empfiehlt, und Ihre Antwort fügt nichts mehr hinzu.
Melebius
1
Ja, es gibt jetzt eine andere Antwort, die 7z empfiehlt. Man kann kaum erwarten, dass Berrys Antwort einer Antwort, die fast fünf Monate später veröffentlicht wurde, „mehr hinzufügt“.
Scott
@Scott Entschuldigung, ich konnte die englischen Monatsabkürzungen nicht richtig lesen.
Melebius,
IN ORDNUNG. Möglicherweise möchten Sie wissen, dass, wenn Sie den Mauszeiger über ein Datum auf der Seite bewegen (und dort „schweben“), das Datum als Zahlen angezeigt wird. (Zumindest funktioniert dies auf Computern; die Leute sagen, dass dies auf Telefonen nicht gut funktioniert.) Außerdem werden unter der rechten unteren Ecke der Frage "aktive älteste Stimmen" angezeigt. Dies ist die Antwortsortierreihenfolge. Wenn Sie auf "älteste" klicken, erhalten Sie die Antworten in der Reihenfolge vom ältesten zum neuesten.
Scott