decomprimi ZIP con la codifica fornita


26

Ho dei file ZIP, che contengono file, i cui nomi di file sono in qualche codifica. Diciamo che conosco la codifica di quei nomi di file, ma non so ancora come decomprimerli correttamente.

Ecco un file di esempio , contiene un file "【SSK 字幕 组】 The Vampire Diaries 吸血鬼 日记 S06E12.ass"

So che la codifica utilizzata è GB18030 (cinese)

La domanda è: come decomprimere quel file in FreeBSD usando unzip o altra utility CLI per ottenere il nome file codificato corretto? Ho provato tutto quello che potevo, ma il risultato non è mai stato buono. Per favore aiuto.

Ho provato su OSX:

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!

Ho provato simili con decomprimere, ma ho un problema simile.

Grazie, ora provo su BSD GRATUITO, dove mi collego usando SSH da OSX (Terminale):

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

La prima cosa che vorrei è mostrare correttamente i nomi cinesi. Ho cambiato

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

Quindi ho scaricato il file e ho provato a "ls" per vedere i caratteri corretti, ma non la fortuna. Quindi penso di dover risolvere il primo locale cinese per verificare quando ottengo il risultato corretto, in realtà posso confrontarlo. Potete aiutarmi anche per favore con questo?

Risposte:


22

Ecco cosa faccio su Ubuntu 16.04 per decomprimere una zip in qualsiasi codifica, purché sappia cos'è quella codifica. Lo stesso metodo dovrebbe funzionare su FreeBSD perché si basa solo su uno unzipstrumento ampiamente disponibile .

  1. Ricontrollo il nome esatto della codifica, per non sbagliare: https://www.iana.org/assignments/character-sets/character-sets.xhtml

  2. Corro semplicemente

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

    o

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

    scegliendo tra -Oo -Isecondo le istruzioni qui:

    $ 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
      ...
    

    il che significa che provo semplicemente -Oe dovrebbe funzionare, perché non molte persone creerebbero un .zipfile in Unix ...


Quindi, per il tuo esempio specifico:

  1. Il nome esatto di codifica è GB18030.

  2. Uso la -Obandiera e:

    $ 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
    

    ... Funziona.


Per le zip create da Windows greco ho avuto successo con questo metodo e codificando CP737
ndemou,

Bravo! Ho ricontrollato la pagina man, in realtà funziona ma non è documentata, nessuno il completamento zsh ha questo parametro.
ttimasdf

2
unzipnon ha questa opzione in Mac OS X e crea sempre nomi di file con codifica percentuale. Il unarsuggerimento di @ javacom ha funzionato come un fascino.
Phil Krylov,

Sembra una funzionalità specifica di Debian. Il mio unzipdice che è UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielere non fornisce tali opzioni.
L29Ah

2
@ L29Ah My unzipin Debian 9 è esattamente la stessa versione e non ha tali opzioni. Probabilmente Ubuntu specifico?
Arnie97,

11

Sulla maggior parte dei filesystem POSIX il nome del file è solo una serie di byte ed è compito dello spazio utente capirlo. Puoi usarlo a tuo vantaggio.

  1. Innanzitutto, estrarre l'archivio usando bsdtar, poiché lo unzipstrumento sembra manipolare i nomi dei file, mentre bsdtar li estraerà grezzi. (Lo sto testando su Linux. Immagino che FreeBSD lo chiami tar.)

    $ bsdtar xf gb18030.zip
    
  2. Verifica che strumenti come questi iconvpossano decodificare correttamente i nomi:

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

    (Notare che ciò influisce solo findsull'output, non sui file stessi.)

  3. Infine utilizza convmvper convertire i nomi dei file in UTF-8:

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

    (Nota: ho dovuto installare Encode :: HanExtra da CPAN per il supporto GB18030 e aggiungere manualmente use Encode::HanExtra;a / usr / bin / convmv anche se dovrebbe

  4. Nel caso in cui convmvnon sia disponibile, copiarlo:

    $ 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
    

    (Almeno su Linux, questo ha un vantaggio in quanto iconvè quasi sempre disponibile e supporta sempre gb18030.)


grazie grawity esaminando questo. Sto testando ora su OSX (ma è molto vicino a FreeBSD e penso che il risultato sarà simile). l'aggiunta di un commento alla mia domanda, non può modificare qui ...
2GE

1
@ 2ge: Ah, OSX potrebbe effettivamente essere molto diverso, poiché HFS + forza i nomi dei file internamente in NFD UTF-16 piuttosto che archiviare i bytestring, quindi c'è la possibilità che danneggi i nomi GB18030 prima che tu abbia la possibilità di convertirli.
user1686

Ho modificato la domanda originale, ho aggiunto altri commenti.
2

Sì, l'ho provato su macOS Sierra e bsdtar ha riportato molti errori "Impossibile creare xxx" (perché i nomi delle directory principali sono corrput). Ho dovuto copiare il mio archivio su un VPS Linux, usare unzip -O per estrarlo e copiare il risultato sul mio Mac usando ssh -C.
Chang Qian,

10

Metodo 1 : utilizzare l'utilità unar

sudo apt-get install unar

unar -e gb18030 gb18030.zip

Metodo 2 : utilizzare uno script Python per decomprimere il file (riferimento 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()

L'esempio gb18030.zip estrae il seguente file

【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12
【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12.ass

2
Grazie, il unarmetodo è il più semplice, almeno su Mac OS X.
Phil Krylov,

4

Su OS X, è possibile utilizzare un'applicazione GUI denominata The Unarchiver . Può essere installato tramite Mac App Store o Homebrew Cask :

brew cask install the-unarchiver

Quando si apre un file ZIP con esso, l'applicazione consente di scegliere la codifica appropriata utilizzando l'anteprima di un nome file dall'archivio.


4

7z supporta l'ID set di caratteri con un interruttore -scs, ad esempio:

7z x -scs903 some.zip

dove 903 è il set di caratteri 中文 簡體. Un elenco più lungo di ID set di caratteri è disponibile qui .


2
7z -scsswitch sceglie solo la codifica @dell'elenco file definito.
Phil Krylov,

1

Usa 7z per estrarre il file

7z x yourfile.zip

Successivamente, converti tu stesso la codifica di quei nomi di file:

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

Questo funziona per me .. from_encoding nel mio caso è tis-620 (che è una codifica tailandese), devi trovare una codifica appropriata della tua lingua. Un popolare di solito risolve il problema, ma se il nome del file è ancora illeggibile, prova a cambiare da_codifica ad altre cose come windows-1252 o shift-jis (giapponese) o qualsiasi altra cosa, puoi elencare la codifica disponibile usando il comando:

convmv --list
iconv --list

Questo è molto semplice il metodo "come risolvere" per me.


0

ho appena usato 7zip ed è riuscito a scegliere la codifica corretta.

(qualcosa che lo zip standard non poteva fare)

ma lo usavo su Windows, con lo strumento GUI. Forse la riga di comando 7z funzionerà anche per te.


C'è una risposta che consiglia 7z e la tua risposta non aggiunge altro.
Melebio

1
Sì, ora c'è un'altra risposta che consiglia 7z. Non puoi aspettarti che la risposta di Berry "aggiunga altro" a una risposta che è stata pubblicata quasi cinque mesi dopo.
Scott

@Scott Mi scuso, non sono riuscito a leggere correttamente le abbreviazioni del mese inglese.
Melebio

OK. Potresti voler sapere che, se metti il ​​puntatore del mouse su qualsiasi data sulla pagina (e "passa il mouse" lì), ti mostrerà la data come numeri. (Almeno questo funziona sui computer, le persone dicono che non funziona bene sui telefoni.) Inoltre, sotto l'angolo in basso a destra della domanda, vedrai "voti attivi più vecchi". Questo è l'ordinamento delle risposte. Se fai clic su "più vecchio", otterrai le risposte in ordine dal più vecchio al più recente.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.