verilen kodlama ile ZIP sıkıştırmasını açma


26

Bazı kodlama dosya adları olan dosyaları içeren ZIP dosya (lar) var. Diyelim ki bu dosya adlarının kodlamasını biliyorum, ama yine de onları nasıl doğru bir şekilde açacağımı bilmiyorum.

İşte örnek dosya , bir dosya içeriyor "【SSK 字幕 组】 The Vampire Diaries 吸血鬼 日记 S06E12.ass"

Kullanılan kodlamanın GB18030 (Çince) olduğunu biliyorum

Soru - nasıl uygun kodlanmış dosya adı almak için unzip veya diğer CLI yardımcı programını kullanarak FreeBSD bu dosyayı açmak için? Elimden gelen her şeyi denedim ama sonuç hiç iyi olmadı. Lütfen yardım et.

OSX'te denedim:

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!

Ben unzip ile benzer denedim, ama benzer bir sorun alıyorum.

Teşekkürler, şimdi ben OSX (Terminal) SSH kullanarak bağlanmak ÜCRETSİZ BSD üzerinde çalışıyor:

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

İlk olarak, Çin isimlerini doğru göstermek istiyorum. Değiştim

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

Sonra dosyayı indirdi ve uygun karakterleri görmek için "ls" denemek, ama şans değil. Bu yüzden doğru sonucu aldığımda doğrulamak için ilk Çin yerel ayarını çözmem gerektiğini düşünüyorum, aslında karşılaştırabilirim. Bana bu konuda da yardımcı olabilir misiniz?

Yanıtlar:


22

İşte bu kodlamanın ne olduğunu bildiğim sürece, herhangi bir kodlamada bir zip dosyasını açmak için Ubuntu 16.04'te yaptığım şey. Aynı yöntem FreeBSD üzerinde çalışmalıdır, çünkü sadece yaygın olarak kullanılan unziparaca dayanır .

  1. Kodlamayı yanlış yazmamak için kodun tam adını tekrar kontrol ediyorum: https://www.iana.org/assignments/character-sets/character-sets.xhtml

  2. Ben sadece koşarım

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

    veya

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

    buradaki talimatlara göre -Oveya -Ibunlara göre seçim yapın :

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

    Bu, basitçe denemem -Ove çalışması gerektiği anlamına gelir , çünkü pek çok insan .zipUnix'te bir dosya oluşturmaz ...


Yani, özel örneğiniz için:

  1. Tam kodlama adı GB18030.

  2. Kullandığım -Obayrak ve:

    $ 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
    

    ... işe yarıyor.


Yunan Windows tarafından oluşturulan fermuarlar için bu yöntem ve CP737 kodlama ile başarılı oldu
ndemou

Bravo! Adam sayfasını iki kez kontrol ettim, aslında çalışıyor ama tamamen belgesiz, hiçbiri zsh tamamlama bu parametreye sahip değil.
ttimasdf

3
unzipMac OS X'te bu seçeneğe sahip değildir ve her zaman yüzde olarak kodlanmış dosya adları oluşturur. @ javacom'un unarönerisi bir cazibe olarak çalıştı.
Phil Krylov

Debian'a özgü bir işleve benziyor. Benim unzipbunu söylüyor UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielerve böyle seçenekler sunmuyor.
L29Ah

2
@ L29Ah My unzipin Debian 9 tam olarak aynı sürüm ve böyle bir seçeneği yok. Muhtemelen Ubuntu'ya özgü mü?
Arnie97

11

Çoğu POSIX dosya sisteminde dosya adı sadece bir bayt dizisidir ve herhangi bir anlam ifade etmek kullanıcı alanına bağlıdır. Bunu kendi yararınıza kullanabilirsiniz.

  1. İlk olarak, kullanarak arşiv ayıklamak bsdtarberi, unziparacı dosya adları parçalamaya görünüyor bsdtar çiğ ayıklamak olurken,. (Bunu Linux'ta test ediyorum. Sanırım FreeBSD bunu çağırıyor tar.)

    $ bsdtar xf gb18030.zip
    
  2. Gibi araçların iconvadları başarıyla çözebildiğini doğrulayın :

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

    (Bunun finddosyaların çıktısını değil, yalnızca çıktıyı etkilediğini unutmayın .)

  3. Son olarak convmv, dosya adlarını UTF-8'e dönüştürmek için kullanın :

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

    (Not: GB18030 desteği için CPAN'dan Encode :: HanExtra'yı yüklemem veuse Encode::HanExtra; gerekiyorsa / usr / bin / convmv dosyasına manuel olarak eklemem gerekti

  4. Kullanılamıyorsa convmv, komut dosyasını yazın:

    $ 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
    

    (En azından Linux'ta, bunun iconvneredeyse her zaman mevcut olması avantajı vardır ve her zaman gb18030'u destekler.)


teşekkür grawity içine bakarak. Şu anda OSX'te test ediyorum (ancak FreeBSD'ye gerçekten yakın ve bence sonuç benzer olacak). soruma yorum ekleyerek, burada düzenlenemez ...
2ge

1
@ 2ge: Ah, OSX aslında oldukça farklı olabilir, çünkü HFS + dahili olarak dosya adlarını bytestring'leri saklamak yerine NFD UTF-16'ya zorlar, bu nedenle bunları dönüştürme şansı elde etmeden önce GB18030 adlarını bozma olasılığı vardır.
user1686

Orijinal soruyu düzenledim, biraz daha yorum ekledim.
2ge

Evet, macOS Sierra'da denedim ve bsdtar çok sayıda "xxx oluşturulamadı" hatalarını bildirdi (çünkü üst dizin adları düzeltildi). Arşivimi bir Linux VPS'e kopyalamak, açmak için unzip -O kullanın ve sonucu ssh -C kullanarak Mac'ime geri kopyaladım.
Chang Qian

10

Yöntem 1 : Unar yardımcı programını kullanma

sudo apt-get install unar

unar -e gb18030 gb18030.zip

Yöntem 2 : Dosyayı açmak için bir python komut dosyası kullanın (başvuru 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()

Örnek gb18030.zip aşağıdaki dosyayı ayıklayacaktır

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

2
Teşekkür ederim, unaryöntem en azından Mac OS X'de en sorunsuzdur.
Phil Krylov

4

OS X'te, Unarchiver adlı bir GUI uygulamasını kullanabilirsiniz . Mac App Store veya Homebrew Cask kullanılarak kurulabilir :

brew cask install the-unarchiver

Bir ZIP dosyasını onunla açtığınızda, uygulama arşivden bir dosya adının önizlemesini kullanarak uygun kodlamayı seçmenizi sağlar.


4

7z bir anahtarla karakter seti kimliğini destekler -scs, örneğin:

7z x -scs903 some.zip

burada 903 簡體 簡體 karakter kümesidir. Daha uzun karakter kümesi kimlikleri burada bulunabilir .


2
7z -scsswitch yalnızca @-defined dosya listesinin kodlamasını seçer .
Phil Krylov

1

Dosyayı ayıklamak için 7z kullanın

7z x yourfile.zip

Bundan sonra, bu dosya adlarının kodlamasını kendiniz dönüştürün:

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

Bu benim için çalışıyor .. from_encoding benim durumumda tis-620 (bu bir Tay kodlama), sizin dilinizin uygun bir kodlama bulmanız gerekir. Popüler bir sorun genellikle çözülür, ancak dosya adı hala okunamıyorsa, windows_ 1252 veya shift-jis (Japonca) veya başka herhangi bir şeye değiştirmeyi deneyin: komutu kullanarak kullanılabilir kodlamayı listeleyebilirsiniz:

convmv --list
iconv --list

Bu benim için çok basit bir "nasıl çözülür" yöntemidir.


0

i sadece 7zip kullandım ve doğru kodlamayı seçmeyi başardı.

(standart zip'in yapamayacağı bir şey)

ancak GUI aracıyla Windows'ta kullandı. Belki 7z komut satırı da sizin için çalışacaktır.


7z öneren bir yanıt var ve cevabınız buna başka bir şey eklemiyor.
Melebius

1
Evet, şimdi 7z'yi öneren başka bir cevap var . Neredeyse beş ay sonra gönderilen bir cevaba Berry'nin cevabının “daha ​​fazlasını” eklemesini beklemiyorsunuz.
Scott

@Scott Özür dilerim, İngilizce ayın kısaltmalarını doğru şekilde okuyamadım.
Melebius

TAMAM. Fare işaretçinizi sayfadaki herhangi bir tarihin üzerine getirdiğinizde (ve oradaki “fareyle üzerine geldiğinizde), tarihin sayı olarak gösterileceğini bilmek isteyebilirsiniz. (En azından bu bilgisayarlarda işe yarıyor; insanlar telefonlarda iyi çalışmadığını söylüyor.) Ayrıca, sorunun sağ alt köşesinde “aktif en eski oyları” göreceksiniz. Bu cevap sıralama düzenidir. “En eskisine” tıklarsanız, cevapları en yeniden en eskiye doğru alırsınız.
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.