डिकम्प्रेसिंग दिए गए एन्कोडिंग के साथ ज़िप


26

मुझे ज़िप फ़ाइल मिली, जिसमें फ़ाइलें हैं, जो फ़ाइलनाम कुछ एन्कोडिंग में हैं। मान लीजिए कि मैं उन फ़ाइलनामों की एन्कोडिंग जानता हूं, लेकिन मैं अभी भी नहीं जानता कि उन्हें ठीक से कैसे कूटना है।

यहाँ उदाहरण है फ़ाइल है , इसमें एक फ़ाइल है "字幕 SSK 组 it file द वैम्पायर डायरी 记 日E S06E12.ass"

मुझे पता है एन्कोडिंग GB18030 (चीनी) है

प्रश्न है - उचित एनकोडेड फ़ाइल नाम प्राप्त करने के लिए अनज़िप या अन्य सीएलआई उपयोगिता का उपयोग करके फ्रीबीएसडी में उस फ़ाइल को कैसे अनपैक किया जाए? मैंने हर वो कोशिश की जो मैं कर सकता था, लेकिन नतीजा कभी अच्छा नहीं रहा। कृपया मदद कीजिए।

मैंने 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!

मैंने अनज़िप के साथ भी ऐसा ही प्रयास किया, लेकिन मुझे भी ऐसी ही समस्या है।

धन्यवाद, अब मुफ़्त BSD पर कोशिश कर रहा हूँ, जहाँ मैं SSH का उपयोग OSX (टर्मिनल) से कर रहा हूँ:

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

पहली बात, मैं चीनी नामों को उचित दिखाना चाहता हूं। मैं बदल गया

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

तब मैंने फ़ाइल डाउनलोड की और उचित वर्ण देखने के लिए "ls" करने का प्रयास किया, लेकिन भाग्य नहीं। इसलिए मुझे लगता है कि मुझे उचित परिणाम मिलने पर सत्यापित करने के लिए पहले चीनी लोकेल को हल करना होगा, वास्तव में मैं इसकी तुलना कर सकता हूं। क्या आप भी कृपया मेरी मदद कर सकते हैं?

जवाबों:


22

यहाँ पर मैं उबंटू 16.04 पर किसी भी एन्कोडिंग में जिप को अनज़िप करने के लिए करता हूँ, जब तक कि मुझे पता है कि एन्कोडिंग क्या है। उसी विधि को FreeBSD पर काम करना चाहिए क्योंकि यह केवल व्यापक रूप से उपलब्ध unzipटूल पर निर्भर करता है।

  1. मैं एन्कोडिंग के सटीक नाम की दोबारा जांच करता हूं, जैसे कि यह गलत नहीं है: https://www.iana.org/assignments/character-sets/character-sets.xhtml

  2. मैं बस चलाता हूं

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

    या

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

    यहां निर्देशों के अनुसार -Oया उसके -Iअनुसार चयन करना:

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

    जिसका मतलब है कि मैं बस कोशिश करता हूं -Oऔर इसे काम करना चाहिए, क्योंकि बहुत सारे लोग .zipयूनिक्स में एक फ़ाइल नहीं बनाएंगे ...


तो, अपने विशिष्ट उदाहरण के लिए:

  1. सटीक एन्कोडिंग नाम है GB18030

  2. मैं -Oध्वज का उपयोग करता हूं और:

    $ 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
    

    ... यह काम करता हैं।


ग्रीक विंडोज द्वारा बनाई गई ज़िप के लिए मुझे इस विधि के साथ सफलता मिली और CP737 एन्कोडिंग
ndemou

वाहवाही! मैंने मैन पेज को डबल चेक किया, यह वास्तव में काम करता है, लेकिन पूरी तरह से अनडिम्डग्रेटेड है, कोई भी zsh पूरा होने पर यह पैरामीटर नहीं है।
ttimasdf

3
unzipमैक ओएस एक्स में यह विकल्प नहीं है और हमेशा प्रतिशत-एन्कोडेड फ़ाइलनाम बनाता है। @ javacom के unarसुझाव ने एक आकर्षण के रूप में काम किया।
फिल किर्लोव

एक डेबियन-विशिष्ट कार्यक्षमता की तरह दिखता है। मेरा unzipयह बताता है UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielerऔर इस तरह के विकल्प प्रदान नहीं करता है।
L29Ah

2
@ L29Ah मेरा unzipडेबियन 9 में बिल्कुल एक ही संस्करण है और इस तरह का कोई विकल्प नहीं है। शायद उबंटू विशिष्ट?
अरनी 97

11

अधिकांश POSIX फाइलसिस्टम पर फ़ाइल नाम बाइट्स की एक श्रृंखला है और इसका कोई भी अर्थ निकालने के लिए उपयोक्ता के पास है। आप अपने लाभ के लिए इसका उपयोग कर सकते हैं।

  1. सबसे पहले, आर्काइव का उपयोग करके निकालें bsdtar, क्योंकि unzipटूल फ़ाइल नामों को मेनल करता है, जबकि bsdtar उन्हें कच्चा निकाल देगा। (मैं लिनक्स पर यह परीक्षण कर रहा हूं। मुझे लगता है कि FreeBSD इसे कॉल करता है tar।)

    $ bsdtar xf gb18030.zip
    
  2. सत्यापित करें कि उपकरण जैसे iconvनाम सफलतापूर्वक डिकोड कर सकते हैं:

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

    (ध्यान दें कि यह केवल findआउटपुट को प्रभावित करता है , न कि फाइलों को।)

  3. अंत convmvमें फ़ाइल नाम को UTF-8 में बदलने के लिए उपयोग करें:

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

    (नोट: मुझे एनकोड स्थापित करना था: GB18030 समर्थन के लिए CPAN से HanExtra, और मैन्युअल रूप use Encode::HanExtra;से / usr / bin / convmv में जोड़ना, भले ही यह माना जाता है

  4. मामले convmvमें अनुपलब्ध है, इसे लिपिबद्ध करें:

    $ 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
    

    (कम से कम लिनक्स पर, इसमें एक फायदा यह iconvहै कि यह लगभग हमेशा उपलब्ध होता है, और यह हमेशा gb18030 का समर्थन करता है)


धन्यवाद गंभीरता इस में देख रहे हैं। मैं अभी OSX पर परीक्षण कर रहा हूं (लेकिन यह वास्तव में FreeBSD के करीब है, और मुझे लगता है कि परिणाम समान होगा)। मेरे सवाल में टिप्पणी जोड़ते हुए, यहां संपादित नहीं किया जा सकता है ...
2ge

1
@ 2ge: आह, OSX वास्तव में काफी भिन्न हो सकता है, क्योंकि HFS + आंतरिक रूप से फाइल को उपविजेता के बजाय NFD UTF-16 में फाइल करता है, इसलिए संभावना है कि यह GB18030 नामों को भ्रष्ट करेगा, इससे पहले कि आप उन्हें परिवर्तित करने का मौका प्राप्त करें।
user1686

मैंने मूल प्रश्न संपादित किया, कुछ और टिप्पणियाँ जोड़ें।
2ge

हाँ, मैंने इसे macOS Sierra पर आज़माया और bsdtar ने "xxx बनाने में विफल" त्रुटियों की बहुत रिपोर्ट की (क्योंकि मूल निर्देशिका के नाम भ्रष्ट हैं)। मेरे संग्रह को लिनक्स वीपीएस पर कॉपी करना था, इसे निकालने के लिए अनज़िप -ओ का उपयोग करें, और परिणाम को कॉपी करके मेरे मैक पर ssh -C का उपयोग कर।
चांग कियान

10

विधि 1 : अनार की उपयोगिता का उपयोग करें

sudo apt-get install unar

unar -e gb18030 gb18030.zip

विधि 2 : फ़ाइल को अनज़िप करने के लिए एक पायथन स्क्रिप्ट का उपयोग करें (संदर्भ 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()

उदाहरण gb18030.zip निम्न फ़ाइल निकालेगा

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

2
धन्यवाद, unarविधि कम से कम मैक ओएस एक्स पर सबसे अधिक परेशानी से मुक्त है।
फिल क्रायलोव

4

OS X पर, आप द अनारकलीर नामक GUI एप्लिकेशन का उपयोग कर सकते हैं । इसे Mac App Store या Homebrew Cask का उपयोग करके इंस्टॉल किया जा सकता है :

brew cask install the-unarchiver

जब आप इसके साथ एक ज़िप फ़ाइल खोलते हैं, तो एप्लिकेशन आपको संग्रह से फ़ाइल नाम के पूर्वावलोकन का उपयोग करके उपयुक्त एन्कोडिंग चुनने देता है।


4

7z एक स्विच के साथ चारसेट आईडी का समर्थन करता है -scs, जैसे:

7z x -scs903 some.zip

जहां 903 90। चारसेट है। चारसेट आईडी की लंबी सूची यहां पाई जा सकती है


2
7z -scsस्विच केवल @-ffined फ़ाइल सूची के एन्कोडिंग का चयन करता है ।
फिल क्रायलोव

1

फ़ाइल को निकालने के लिए 7z का उपयोग करें

7z x yourfile.zip

उसके बाद, उन फ़ाइलनामों के एन्कोडिंग को स्वयं में कनवर्ट करें:

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

यह मेरे लिए काम करता है .. मेरे मामले में from_encoding tis-620 है (जो एक थाई एन्कोडिंग है), आपको अपनी भाषा का एक उपयुक्त एन्कोडिंग खोजने की आवश्यकता है। एक लोकप्रिय आमतौर पर समस्या का हल करता है लेकिन अगर फ़ाइल का नाम अभी भी अपठनीय है, तो Windows_1252 या शिफ्ट-जिस (जापानी) या जो भी हो, से अन्य चीजों को बदलने का प्रयास करें, आप कमांड का उपयोग करके उपलब्ध एन्कोडिंग को सूचीबद्ध कर सकते हैं:

convmv --list
iconv --list

यह मेरे लिए बहुत सरल "कैसे हल करें" विधि है।


0

मैं सिर्फ 7zip का इस्तेमाल किया और यह सही एन्कोडिंग लेने में कामयाब रहा।

(ऐसा कुछ जो मानक ज़िप नहीं कर सका)

लेकिन इसे GUI टूल के साथ विंडोज पर इस्तेमाल किया। शायद कमांड लाइन 7z आपके लिए भी काम करेगा।


7z की सिफारिश करने वाला एक उत्तर है और आपका उत्तर इससे अधिक कुछ नहीं जोड़ता है।
मेलेबियस

1
हां, अब 7z की सिफारिश करने वाला एक और जवाब है। लगभग पांच महीने बाद पोस्ट किए गए उत्तर के लिए आप बेरी के जवाब को "अधिक जोड़ें" की उम्मीद कर सकते हैं।
स्कॉट

@ मेरी क्षमा याचना, मैं अंग्रेजी महीने के संक्षिप्त विवरण को सही ढंग से पढ़ने में विफल रहा।
मेलेबियस

ठीक। आप जानना चाह सकते हैं कि, यदि आप पृष्ठ पर किसी भी तारीख को अपना माउस पॉइंटर डालते हैं (और वहां "होवर"), तो यह आपको संख्याओं के रूप में दिनांक दिखाएगा। (कम से कम यह कंप्यूटर पर काम करता है; लोग कहते हैं कि यह फोन पर अच्छी तरह से काम नहीं करता है।) इसके अलावा, सवाल के निचले दाएं कोने के नीचे, आप "सक्रिय सबसे पुराने वोट" देखेंगे। यह उत्तर क्रम क्रम है। यदि आप "सबसे पुराने" पर क्लिक करते हैं, तो आपको उत्तर सबसे पुराने से नवीनतम तक मिलेंगे।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.