dekompresi ZIP dengan pengkodean yang diberikan

26

Saya mendapatkan file ZIP, yang berisi file, nama file mana yang ada dalam beberapa penyandian. Katakanlah saya tahu penyandian nama file itu, tapi saya masih tidak tahu cara mendekompresnya dengan benar.

Berikut adalah contoh file , ini berisi satu file "【SSK 字幕 组】 The Vampire Diaries 吸血鬼 日记 S06E12.ass"

Saya tahu penyandian yang digunakan adalah GB18030 (Bahasa Cina)

Pertanyaannya adalah - bagaimana cara membongkar file itu di FreeBSD menggunakan unzip atau utilitas CLI lainnya untuk mendapatkan nama file yang disandikan? Saya mencoba semua yang saya bisa, tetapi hasilnya tidak pernah baik. Tolong bantu.

Saya mencoba di 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!

Saya mencoba mirip dengan unzip, tetapi saya mendapatkan masalah yang sama.

Terima kasih, sekarang mencoba BSD GRATIS, tempat saya terhubung menggunakan SSH dari OSX (Terminal):

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

Hal pertama yang ingin saya lakukan adalah menunjukkan nama-nama Tionghoa yang benar. aku berubah

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

Kemudian saya mengunduh file dan mencoba "ls" untuk melihat karakter yang tepat, tetapi tidak beruntung. Jadi saya pikir saya harus menyelesaikan lokal China pertama untuk memverifikasi ketika saya mendapatkan hasil yang tepat, sebenarnya saya bisa membandingkannya. Bisakah Anda membantu saya dengan ini?

2ge
sumber

Jawaban:

22

Inilah yang saya lakukan pada Ubuntu 16.04 untuk membuka ritsleting zip dalam pengkodean apa pun, selama saya tahu apa itu pengkodean. Metode yang sama harus bekerja pada FreeBSD karena hanya bergantung pada unzipalat yang tersedia secara luas .

  1. Saya memeriksa ulang nama penyandian, agar tidak salah mengeja: https://www.iana.org/assignments/character-sets/character-sets.xhtml

  2. Saya hanya berlari

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

    atau

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

    memilih antara -Oatau -Isesuai dengan instruksi di sini:

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

    yang berarti bahwa saya hanya mencoba -Odan itu harus berfungsi, karena tidak banyak orang akan membuat .zipfile di Unix ...


Jadi, untuk contoh spesifik Anda:

  1. Nama penyandian yang tepat adalah GB18030.

  2. Saya menggunakan -Obendera dan:

    $ 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
    

    ... berhasil.

mbdevpl
sumber
Untuk ritsleting yang dibuat oleh Windows Yunani, saya berhasil dengan metode ini dan menyandikan CP737
ndemou
Bravo! Saya mengecek halaman manual, itu benar-benar berfungsi tetapi benar-benar tidak berdokumen, tidak ada penyelesaian zsh yang memiliki parameter ini.
ttimasdf
2
unziptidak memiliki opsi ini di Mac OS X dan selalu membuat nama file yang dikodekan persen. Saran @ javacom unarbekerja sebagai pesona.
Phil Krylov
Sepertinya fungsionalitas khusus Debian. Saya unzipmengatakan itu UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielerdan tidak memberikan opsi seperti itu.
L29Ah
2
@ L29Ah My unzipin Debian 9 persis versi yang sama dan tidak memiliki opsi seperti itu. Mungkin spesifik Ubuntu?
Arnie97
11

Pada kebanyakan sistem file POSIX, nama file hanya serangkaian byte dan terserah ruang pengguna untuk memahaminya. Anda dapat menggunakan ini untuk keuntungan Anda.

  1. Pertama, ekstrak arsip menggunakan bsdtar, karena unzipalat ini tampaknya memotong-motong nama file, sementara bsdtar akan mengekstraknya mentah. (Saya sedang menguji ini di Linux. Saya kira FreeBSD hanya menyebutnya tar.)

    $ bsdtar xf gb18030.zip
    
  2. Verifikasi bahwa alat seperti iconvberhasil dapat memecahkan kode nama:

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

    (Perhatikan bahwa ini hanya memengaruhi findoutput, bukan file itu sendiri.)

  3. Terakhir digunakan convmvuntuk mengonversi nama file ke UTF-8:

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

    (Catatan: Saya harus menginstal Encode :: HanExtra dari CPAN untuk dukungan GB18030, dan secara manual menambahkan use Encode::HanExtra;ke / usr / bin / convmv meskipun seharusnya

  4. Dalam hal convmvtidak tersedia, skrip:

    $ 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
    

    (Setidaknya di Linux, ini memiliki keunggulan karena iconvhampir selalu tersedia, dan selalu mendukung gb18030.)

pengguna1686
sumber
terima kasih grawity melihat ke dalam ini. Saya sedang menguji sekarang di OSX (tapi itu benar-benar dekat dengan FreeBSD, dan saya pikir hasilnya akan serupa). menambahkan komentar untuk pertanyaan saya, tidak dapat mengedit sini ...
2ge
1
@ 2ge: Ah, OSX mungkin sebenarnya sangat berbeda, karena HFS + secara internal memaksa nama file ke NFD UTF-16 daripada menyimpan bytestrings, jadi ada kemungkinan itu akan merusak nama-nama GB18030 sebelum Anda mendapatkan kesempatan untuk mengubahnya.
user1686
Saya mengedit pertanyaan asli, menambahkan beberapa komentar.
Agustus
Ya, saya mencobanya di macOS Sierra dan bsdtar melaporkan banyak kesalahan "Gagal membuat xxx" (karena nama direktori induk adalah corrput). Harus menyalin arsip saya ke VPS Linux, gunakan unzip -O untuk mengekstraknya, dan salin hasilnya kembali ke Mac saya menggunakan ssh -C.
Chang Qian
10

Metode 1 : gunakan utilitas unar

sudo apt-get install unar

unar -e gb18030 gb18030.zip

Metode 2 : Gunakan skrip python untuk unzip file (referensi 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()

Contoh gb18030.zip akan mengekstrak file berikut

【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12
【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12.ass
javacom
sumber
2
Terima kasih, unarmetode ini paling tidak merepotkan, setidaknya di Mac OS X.
Phil Krylov
4

Pada OS X, Anda dapat menggunakan aplikasi GUI yang disebut The Unarchiver . Ini dapat diinstal menggunakan Mac App Store atau Homebrew Cask :

brew cask install the-unarchiver

Saat Anda membuka file ZIP dengannya, aplikasi memungkinkan Anda memilih pengodean yang sesuai menggunakan pratinjau nama file dari arsip.

Melebius
sumber
4

7z mendukung ID charset dengan sakelar -scs, mis .:

7z x -scs903 some.zip

di mana 903 adalah charset 中文 簡體. Daftar ID charset yang lebih panjang dapat ditemukan di sini .

ohho
sumber
2
7z -scsswitch hanya memilih pengodean dari @daftar file -defined.
Phil Krylov
1

Gunakan 7z untuk mengekstrak file

7z x yourfile.zip

Setelah itu, konversi sendiri pengkodean nama file tersebut:

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

Ini berfungsi untuk saya .. from_encoding dalam kasus saya adalah tis-620 (yang merupakan pengkodean Thailand), Anda perlu menemukan pengkodean yang sesuai dari bahasa Anda. Yang populer biasanya menyelesaikan masalah tetapi jika nama file masih belum dapat dibaca maka cobalah mengubah from_encoding ke hal-hal lain seperti windows-1252 atau shift-jis (Jepang) atau apa pun, Anda dapat mendaftar pengkodean yang tersedia menggunakan perintah:

convmv --list
iconv --list

Ini adalah metode "cara mengatasi" yang sangat sederhana bagi saya.

off99555
sumber
0

Saya hanya menggunakan 7zip dan berhasil memilih penyandian yang tepat.

(sesuatu yang tidak bisa dilakukan zip standar)

tetapi menggunakannya pada Windows, dengan alat GUI. Mungkin baris perintah 7z akan bekerja untuk Anda juga.

Berry Tsakala
sumber
Ada jawaban yang merekomendasikan 7z dan jawaban Anda tidak menambahkan apa pun.
Melebius
1
Ya, sekarang ada jawaban lain yang merekomendasikan 7z. Anda hampir tidak dapat mengharapkan jawaban Berry untuk "menambahkan lebih banyak" ke jawaban yang diposting hampir lima bulan kemudian.
Scott
@Scott Maaf, saya gagal membaca singkatan bahasa Inggris dengan benar.
Melebius
BAIK. Anda mungkin ingin tahu itu, jika Anda meletakkan penunjuk tetikus Anda di atas tanggal pada halaman (dan "melayang" di sana), itu akan menunjukkan tanggal sebagai angka. (Setidaknya ini berfungsi pada komputer; orang mengatakan itu tidak berfungsi dengan baik pada ponsel.) Juga, di bawah sudut kanan bawah pertanyaan, Anda akan melihat "suara tertua aktif". Ini adalah urutan pengurutan jawaban. Jika Anda mengeklik "terlama", maka Anda akan mendapatkan jawaban sesuai urutan dari terlama hingga terbaru.
Scott