ขยาย ZIP ด้วยการเข้ารหัสที่กำหนด


26

ฉันได้รับไฟล์ ZIP ซึ่งมีไฟล์ซึ่งชื่อไฟล์อยู่ในการเข้ารหัสบางส่วน สมมติว่าฉันรู้การเข้ารหัสของชื่อไฟล์เหล่านั้น แต่ฉันก็ยังไม่รู้วิธีการแตกไฟล์อย่างถูกต้อง

นี่คือไฟล์ตัวอย่างประกอบด้วยหนึ่งไฟล์ "【 SSK 字幕字幕组 The Vampire Diaries 吸血鬼日记 S06E12.ass"

ฉันรู้ว่าการเข้ารหัสที่ใช้คือ GB18030 (ภาษาจีน)

คำถามคือ - วิธีคลายไฟล์ใน FreeBSD โดยใช้ unzip หรือยูทิลิตี้อื่น ๆ ของ CLI เพื่อรับชื่อไฟล์ที่เข้ารหัสได้อย่างไร ฉันลองทุกอย่างเท่าที่จะทำได้ แต่ผลลัพธ์ก็ไม่ดี กรุณาช่วย.

ฉันลองบน 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 (Terminal):

# 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

นี่คือสิ่งที่ฉันทำบน Ubuntu 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ไฟล์ใน Unix ...


ดังนั้นสำหรับตัวอย่างเฉพาะของคุณ:

  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
    

    ... มันได้ผล.


สำหรับรหัสไปรษณีย์ที่สร้างขึ้นโดย Greek Windows ฉันประสบความสำเร็จด้วยวิธีนี้และการเข้ารหัส CP737
ndemou

ไชโย! ผมตรวจสอบคู่หน้าคนก็จริงทำงานแต่ไม่มีเอกสารทั้งหมดไม่มีใครเสร็จ zsh มีพารามิเตอร์นี้
ttimasdf

3
unzipไม่มีตัวเลือกนี้ใน Mac OS X และสร้างชื่อไฟล์ที่เข้ารหัสเป็นเปอร์เซ็นต์ unarคำแนะนำของ @javacom ทำงานได้อย่างมีเสน่ห์
Phil Krylov

ดูเหมือนว่าฟังก์ชั่นเฉพาะ Debian ฉันunzipบอกมันUnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielerและไม่มีตัวเลือกดังกล่าว
L29Ah

2
@ L29Ah ฉันunzipใน Debian 9 เป็นรุ่นเดียวกันและไม่มีตัวเลือกดังกล่าว อาจเป็น Ubuntu เฉพาะหรือไม่
Arnie97

11

ในระบบไฟล์ POSIX ส่วนใหญ่ชื่อไฟล์เป็นเพียงชุดของไบต์และมันขึ้นอยู่กับผู้ใช้เพื่อให้ความรู้สึกใด ๆ คุณสามารถใช้สิ่งนี้เพื่อประโยชน์ของคุณ

  1. ขั้นแรกให้แยกไฟล์เก็บถาวรโดยใช้bsdtarเนื่องจากunzipเครื่องมือดูเหมือนจะทำให้ชื่อไฟล์ยุ่งเหยิงในขณะที่ bsdtar จะทำการแยกไฟล์ดิบ (ฉันกำลังทดสอบสิ่งนี้บน Linux ฉันเดาว่า 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 .
    

    (หมายเหตุ: ฉันต้องติดตั้ง Encode :: HanExtra จาก CPAN สำหรับการสนับสนุน GB18030 และเพิ่ม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.)


ขอบคุณ grawity กำลังดูสิ่งนี้ ตอนนี้ฉันกำลังทดสอบบน OSX (แต่นั่นใกล้เคียงกับ FreeBSD จริงๆและฉันคิดว่าผลลัพธ์จะคล้ายกัน) เพิ่มความคิดเห็นให้กับคำถามของฉันไม่สามารถแก้ไขได้ที่นี่ ...
2ge

1
@ 2ge: โอ้ OSX อาจจะแตกต่างกันมากเนื่องจาก HFS + บังคับให้ชื่อไฟล์ภายใน NFD UTF-16 มากกว่าการจัดเก็บการทดสอบดังนั้นจึงมีความเป็นไปได้ที่จะทำให้ชื่อ GB18030 เสียหายก่อนที่คุณจะแปลง
user1686

ฉันแก้ไขคำถามเดิมเพิ่มความคิดเห็นเพิ่มเติม
2ge

ใช่ฉันลองใช้กับ macOS Sierra และ bsdtar รายงานข้อผิดพลาด "ล้มเหลวในการสร้าง xxx" จำนวนมาก (เนื่องจากชื่อไดเรกทอรีหลักมีความสัมพันธ์กัน) ต้องคัดลอกไฟล์เก็บถาวรของฉันไปยัง Linux VPS ใช้ unzip -O เพื่อแยกมันและคัดลอกผลลัพธ์กลับไปที่ Mac ของฉันโดยใช้ ssh -C
Chang Qian

10

วิธีที่ 1 : ใช้ยูทิลิตี unar

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วิธีนี้เป็นวิธีที่ไม่ยุ่งยากอย่างน้อยที่สุดสำหรับ Mac OS X
Phil Krylov

4

บน OS X, คุณสามารถใช้โปรแกรม GUI ที่เรียกว่าUnarchiver สามารถติดตั้งได้โดยใช้Mac App StoreหรือHomebrew Cask :

brew cask install the-unarchiver

เมื่อคุณเปิดไฟล์ ZIP แอปพลิเคชันจะช่วยให้คุณเลือกการเข้ารหัสที่เหมาะสมโดยใช้การแสดงตัวอย่างของชื่อไฟล์จากไฟล์เก็บถาวร


4

7z รองรับ charset ID พร้อมสวิตช์-scsเช่น:

7z x -scs903 some.zip

ที่ 903 คือ中文中文 charset รายการยาวของรหัส charset สามารถพบได้ที่นี่


2
7z -scsswitch เลือกการเข้ารหัสของ@รายการไฟล์ที่กำหนดไว้เท่านั้น
Phil Krylov

1

ใช้ 7z เพื่อแยกไฟล์

7z x yourfile.zip

หลังจากนั้นแปลงการเข้ารหัสของชื่อไฟล์เหล่านั้นด้วยตัวเอง:

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

สิ่งนี้ใช้ได้กับฉัน .. from_encoding ในกรณีของฉันคือ tis-620 (ซึ่งเป็นการเข้ารหัสภาษาไทย) คุณต้องค้นหาการเข้ารหัสภาษาที่เหมาะสมของคุณ ชื่อที่ได้รับความนิยมมักจะแก้ปัญหา แต่ถ้าชื่อไฟล์ยังอ่านไม่ได้ให้ลองเปลี่ยน from_encoding เป็นสิ่งอื่นเช่น windows-1252 หรือ shift-jis (ภาษาญี่ปุ่น) หรืออะไรก็ตามคุณสามารถแสดงรายการการเข้ารหัสที่มีอยู่โดยใช้คำสั่ง:

convmv --list
iconv --list

นี่เป็นวิธีการ "แก้ปัญหา" ที่ง่ายมากสำหรับฉัน


0

ฉันเพิ่งใช้ 7zip และจัดการเลือกการเข้ารหัสที่ถูกต้อง

(สิ่งที่รหัสไปรษณีย์มาตรฐานไม่สามารถทำได้)

แต่ใช้บน Windows ด้วยเครื่องมือ GUI บางทีบรรทัดคำสั่ง 7z ก็ใช้ได้สำหรับคุณเช่นกัน


มีคำตอบคือแนะนำ 7zและคำตอบของคุณไม่เพิ่มอะไรอีก
Melebius

1
ใช่ตอนนี้มีคำตอบอื่นแนะนำให้ 7z คุณแทบจะไม่สามารถคาดหวังคำตอบของ Berry ในการ "เพิ่มมากขึ้น" กับคำตอบที่โพสต์ไว้เกือบห้าเดือนต่อมา
สกอตต์

@Scott คำขอโทษของฉันฉันไม่สามารถอ่านตัวย่อภาษาอังกฤษได้อย่างถูกต้อง
Melebius

ตกลง. คุณอาจต้องการทราบว่าหากคุณวางตัวชี้เมาส์ของคุณบนวันใด ๆ บนหน้า (และ "โฮเวอร์" ที่นั่น) มันจะแสดงวันที่เป็นตัวเลข (อย่างน้อยสิ่งนี้ใช้ได้กับคอมพิวเตอร์คนอื่นบอกว่าใช้งานไม่ได้กับโทรศัพท์) นอกจากนี้ที่มุมล่างขวาของคำถามคุณจะเห็น นี่คือคำสั่งการเรียงลำดับคำตอบ หากคุณคลิกที่ "เก่าที่สุด" คุณจะได้รับคำตอบตามลำดับจากเก่าไปหาใหม่
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.