giải nén ZIP với mã hóa đã cho


25

Tôi đã nhận (các) tệp ZIP, chứa các tệp, tên tệp nằm trong một số mã hóa. Giả sử tôi biết mã hóa tên tệp đó, nhưng tôi vẫn không biết cách giải nén chúng đúng cách.

Đây là tập tin ví dụ , nó chứa một tập tin "【SSK 字幕 组】 Nhật ký ma cà rồng 吸血鬼 06 S06E12.ass"

Tôi biết mã hóa được sử dụng là GB18030 (tiếng Trung Quốc)

Câu hỏi là - làm thế nào để giải nén tệp đó trong FreeBSD bằng cách giải nén hoặc tiện ích CLI khác để có được tên tệp được mã hóa phù hợp? Tôi đã thử mọi thứ tôi có thể, nhưng kết quả không bao giờ tốt. Xin vui lòng giúp đỡ.

Tôi đã thử trên 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!

Tôi đã thử tương tự với giải nén, nhưng tôi gặp vấn đề tương tự.

Cảm ơn, hiện đang thử BSD MIỄN PHÍ, nơi tôi đang kết nối bằng SSH từ 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

Điều đầu tiên, tôi muốn là hiển thị đúng tên tiếng Trung. tôi đã thay đổi

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

Sau đó, tôi đã tải xuống tệp và cố gắng "ls" để xem các ký tự phù hợp, nhưng không may mắn. Vì vậy, tôi nghĩ rằng tôi phải giải quyết miền địa phương đầu tiên của Trung Quốc để xác minh khi tôi nhận được kết quả phù hợp, thực sự tôi có thể so sánh nó. Bạn cũng có thể giúp tôi với điều này?

Câu trả lời:


22

Đây là những gì tôi làm trên Ubuntu 16.04 để giải nén một zip trong bất kỳ mã hóa nào, miễn là tôi biết mã hóa đó là gì. Phương pháp tương tự sẽ hoạt động trên FreeBSD vì nó chỉ dựa vào unzipcông cụ có sẵn rộng rãi .

  1. Tôi kiểm tra kỹ tên chính xác của mã hóa, để không viết sai chính tả: https://www.iana.org/assignments/character-sets/character-sets.xhtml

  2. Tôi chỉ đơn giản là chạy

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

    hoặc là

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

    lựa chọn giữa -Ohoặc -Itheo hướng dẫn ở đây:

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

    điều đó có nghĩa là tôi chỉ cần thử -Ovà nó sẽ hoạt động, bởi vì không nhiều người sẽ tạo một .ziptệp trong Unix ...


Vì vậy, cho ví dụ cụ thể của bạn:

  1. Tên mã hóa chính xác là GB18030.

  2. Tôi sử dụng -Ocờ và:

    $ 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
    

    ... nó hoạt động.


Đối với các khóa được tạo bởi Windows Hy Lạp, tôi đã thành công với phương pháp này và mã hóa CP737
ndemou

Bravo! Tôi đã kiểm tra lại trang man, nó thực sự hoạt động nhưng hoàn toàn không có giấy tờ, không có phần hoàn thành zsh nào có tham số này.
ttimasdf

2
unzipkhông có tùy chọn này trong Mac OS X và luôn tạo tên tệp được mã hóa theo phần trăm. unarĐề xuất của @ javacom làm việc như một cơ duyên.
Phil Krylov

Trông giống như một chức năng dành riêng cho Debian. My unzipnói với nó UnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielervà không cung cấp các tùy chọn như vậy.
L29Ah

1
@ L29Ah My unziptrong Debian 9 hoàn toàn giống phiên bản và không có tùy chọn như vậy. Có lẽ Ubuntu cụ thể?
Arnie97

11

Trên hầu hết các hệ thống tệp POSIX, tên tệp chỉ là một chuỗi byte và tùy thuộc vào không gian người dùng để hiểu ý nghĩa của nó. Bạn có thể sử dụng điều này để lợi thế của bạn.

  1. Đầu tiên, trích xuất kho lưu trữ bằng cách sử dụng bsdtar, vì unzipcông cụ dường như xáo trộn tên tệp, trong khi bsdtar sẽ trích xuất chúng thô. (Tôi đang thử nghiệm điều này trên Linux. Tôi đoán FreeBSD chỉ gọi nó tar.)

    $ bsdtar xf gb18030.zip
    
  2. Xác minh rằng các công cụ như iconvcó thể giải mã thành công tên:

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

    (Lưu ý rằng điều này chỉ ảnh hưởng đến findđầu ra, không phải bản thân tệp.)

  3. Cuối cùng sử dụng convmvđể chuyển đổi tên tệp thành UTF-8:

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

    (Lưu ý: Tôi đã phải cài đặt Encode :: HanExtra từ CPAN cho hỗ trợ GB18030 thêm thủ công use Encode::HanExtra;vào / usr / bin / convmv mặc dù nó được cho là

  4. Trong trường hợp convmvkhông có sẵn, script 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
    

    (Ít nhất là trên Linux, điều này có một lợi thế iconvlà hầu như luôn có sẵn và nó luôn hỗ trợ gb18030.)


cảm ơn grawity nhìn vào này. Tôi hiện đang thử nghiệm trên OSX (nhưng nó thực sự gần với FreeBSD và tôi nghĩ kết quả sẽ tương tự). thêm bình luận vào câu hỏi của tôi, không thể chỉnh sửa ở đây ...
2ge 2/215

1
@ 2ge: Ah, OSX thực sự có thể khá khác biệt, vì nội bộ HFS + buộc các tên tệp vào NFD UTF-16 thay vì lưu trữ bytestrings, vì vậy có khả năng nó sẽ làm hỏng tên GB18030 trước khi bạn có cơ hội chuyển đổi chúng.
user1686 2/2/2015

Tôi chỉnh sửa câu hỏi ban đầu, thêm một số ý kiến.
2ge

Vâng, tôi đã thử nó trên macOS Sierra và bsdtar đã báo cáo rất nhiều lỗi "Không thể tạo xxx" (vì tên thư mục mẹ là chính xác). Phải sao chép kho lưu trữ của tôi vào VPS Linux, sử dụng giải nén -O để giải nén nó và sao chép kết quả trở lại máy Mac của tôi bằng ssh -C.
Chang Qian

10

Phương pháp 1 : sử dụng tiện ích unar

sudo apt-get install unar

unar -e gb18030 gb18030.zip

Phương pháp 2 : Sử dụng tập lệnh python để giải nén tệp (tham khảo 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()

Ví dụ gb18030.zip sẽ giải nén tệp sau

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

2
Cảm ơn bạn, unarphương pháp này ít rắc rối nhất ít nhất trên Mac OS X.
Phil Krylov

4

Trên OS X, bạn có thể sử dụng ứng dụng GUI có tên The Unarchiver . Nó có thể được cài đặt bằng Mac App Store hoặc Homebrew Cask :

brew cask install the-unarchiver

Khi bạn mở tệp ZIP với nó, ứng dụng cho phép bạn chọn mã hóa phù hợp bằng cách sử dụng bản xem trước của tên tệp từ kho lưu trữ.


4

7z hỗ trợ ID bộ ký tự với một công tắc -scs, ví dụ:

7z x -scs903 some.zip

trong đó 903 là trang bộ ký tự. Một danh sách dài hơn các ID bộ ký tự có thể được tìm thấy ở đây .


2
7z -scsswitch chỉ chọn mã hóa của @danh sách tập tin được xác định.
Phil Krylov

1

Sử dụng 7z để giải nén tập tin

7z x yourfile.zip

Sau đó, tự chuyển đổi mã hóa của các tên tệp đó:

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

Điều này làm việc cho tôi .. from_encoding trong trường hợp của tôi là tis-620 (là mã hóa tiếng Thái), bạn cần tìm một mã hóa phù hợp cho ngôn ngữ của mình. Một cái phổ biến thường giải quyết vấn đề nhưng nếu tên tệp vẫn không thể đọc được thì hãy thử thay đổi từ_encoding sang những thứ khác như windows-1252 hoặc shift-jis (tiếng Nhật) hoặc bất cứ điều gì, bạn có thể liệt kê mã hóa có sẵn bằng lệnh:

convmv --list
iconv --list

Đây là phương pháp "giải quyết" rất đơn giản đối với tôi.


-1

tôi chỉ sử dụng 7zip và nó quản lý để chọn đúng mã hóa.

(điều mà zip tiêu chuẩn không thể làm)

nhưng đã sử dụng nó trên Windows, với công cụ GUI. Có lẽ dòng lệnh 7z cũng sẽ làm việc cho bạn.


Có một câu trả lời đề nghị 7z và câu trả lời của bạn không thêm gì vào đó.
Melebius

1
Vâng, bây giờ có một câu trả lời khác đề nghị 7z. Bạn khó có thể mong đợi câu trả lời của Berry đối với những người khác đã thêm nhiều câu trả lời cho một câu trả lời đã được đăng gần năm tháng sau đó.
Scott

@ Xin lỗi Tôi xin lỗi, tôi đã không đọc được chữ viết tắt tháng tiếng Anh một cách chính xác.
Melebius

ĐỒNG Ý. Bạn có thể muốn biết rằng, nếu bạn đặt con trỏ chuột của bạn trên bất kỳ ngày nào trên trang (và con tàu lượn ở đó), nó sẽ hiển thị cho bạn ngày dưới dạng số. (Ít nhất điều này hoạt động trên máy tính; mọi người nói rằng nó không hoạt động tốt trên điện thoại.) Ngoài ra, bên dưới góc dưới bên phải của câu hỏi, bạn sẽ thấy Hồi hoạt động bỏ phiếu lâu đời nhất. Đây là thứ tự sắp xếp câu trả lời. Nếu bạn nhấp vào lâu đời nhất, thì bạn sẽ nhận được câu trả lời theo thứ tự từ cũ nhất đến mới nhất.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.