Làm cách nào tôi có thể giải nén chính xác tệp lưu trữ ZIP của các tệp có tên bằng tiếng Do Thái?


18

Ai đó đã gửi cho tôi một tệp ZIP chứa các tệp có tên tiếng Do Thái (và được tạo trên Windows, không chắc chắn với công cụ nào). Tôi sử dụng LXDE trên Debian Stretch. Trình quản lý lưu trữ Gnome quản lý để giải nén tệp, nhưng các ký tự tiếng Do Thái bị cắt xén. Tôi nghĩ rằng tôi đang nhận được các octet UTF-8 được mở rộng thành các ký tự Unicode, ví dụ: tôi có một tệp có tên có bốn ký tự và một chữ số .doc và các ký tự là: 0x008E 0x0087 0x008E 0x0085. Sử dụng tiện ích giải nén dòng lệnh thậm chí còn tệ hơn - nó từ chối giải nén hoàn toàn, phàn nàn về một "đa nhân hoặc không đầy đủ hoặc không đầy đủ ký tự".

Vì vậy, câu hỏi của tôi là:

  • Có tiện ích giải nén nào khác sẽ giải nén các tệp của tôi với tên chính xác không?
  • Có điều gì đó không đúng với cách tệp được nén, hay đó chỉ là sự không tương thích của việc triển khai ZIP? Hoặc thậm chí không phù hợp / lỗi của các tiện ích ZIP Linux?
  • Tôi có thể làm gì để có được tên tệp chính xác sau khi giải nén bằng cách sử dụng tên bị cắt xén?

Nếu bạn tra cứu các byte trong bảng cp862 , tên tệp có khớp với những gì bạn mong đợi không? Nếu không, bạn có biết mã hóa riêng của máy nguồn không?
Michael Homer

Ditto cho cp1255 , và bất kỳ mã hóa hợp lý nào khác; có thể chỉ cần làm việc dựa trên những gì có vẻ đúng.
Michael Homer

@MichaelHomer: Không, có vẻ như nó không khớp. Mã hóa riêng của máy nguồn là bất cứ thứ gì MS Windows sử dụng khi bạn đặt cài đặt khu vực thành tiếng Do Thái-Israel, vì vậy tôi đoán đôi khi nó là UTF-8 và đôi khi là CP1255.
einpoklum - phục hồi Monica

Câu trả lời:


15

Nghe có vẻ như tên tệp được mã hóa trong một trong các bộ mã độc quyền của Windows ( CP862 , 1255 , v.v.).

  • Có tiện ích giải nén nào khác sẽ giải nén các tệp của tôi với tên chính xác không? Tôi không biết tiện ích zip hỗ trợ các trang mã này nguyên bản. 7z có một số hiểu biết về mã hóa, nhưng tôi tin rằng nó phải là một mã hóa mà hệ thống của bạn biết về tổng quát hơn (bạn chọn nó bằng cách đặt LANGbiến môi trường) và các mã hóa Windows có thể không nằm trong số đó.

    unzip -UUnên làm việc từ dòng lệnh để tạo các tệp có byte chính xác trong tên của chúng (bằng cách vô hiệu hóa tất cả hỗ trợ Unicode). Đó có lẽ là hiệu ứng bạn có được từ công cụ của Gnome. Mã hóa sẽ không đúng theo bất kỳ cách nào, nhưng chúng ta có thể khắc phục điều đó bên dưới.

  • Có điều gì đó không đúng với cách tệp được nén, hay đó chỉ là sự không tương thích của việc triển khai ZIP? Hoặc thậm chí không phù hợp / lỗi của các tiện ích ZIP Linux? Các tập tin bạn đã được đưa ra không được tạo ra. Điều đó không nhất thiết sai đối với việc sử dụng nội bộ trong đó mã hóa được cố định và được biết trước, mặc dù đặc tả định dạng nói rằng các tên được cho là UTF-8 hoặc cp437 và của bạn cũng không. Ngay cả giữa các máy Windows, sử dụng các bộ mã khác nhau cũng không hoạt động tốt, nhưng các máy không chạy Windows không có khái niệm về các trang mã đó để bắt đầu. Hầu hết các công cụ UTF-8 mã hóa tên tệp của chúng (vẫn không phải lúc nào cũng đủ để tránh sự cố).

  • Tôi có thể làm gì để có được tên tệp chính xác sau khi giải nén bằng cách sử dụng tên bị cắt xén? Nếu bạn có thể xác định mã hóa tên tệp, bạn có thể chuyển đổi các byte trong tên hiện có thành UTF-8 và di chuyển các tệp hiện có sang đúng tên. Công convmvcụ về cơ bản kết thúc quá trình đó thành một lệnh duy nhất: convmv -f cp862 -t utf8 -r .sẽ cố gắng chuyển đổi mọi thứ bên trong .từ cp862 sang UTF-8.

    Ngoài ra, bạn có thể sử dụng iconvfindđể di chuyển mọi thứ đến tên chính xác của họ. Cái gì đó như:

    find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp862 -t utf8)"' sh {} \;
    

    sẽ tìm thấy tất cả các tệp bên dưới thư mục hiện tại và cố gắng chuyển đổi tên thành UTF-8.

    Trong cả hai trường hợp, bạn có thể thử nghiệm với các bảng mã khác nhau và cố gắng tìm một bảng mã có ý nghĩa.


Sau khi bạn đã sửa mã hóa cho bạn, nếu bạn muốn gửi các tệp này theo hướng khác, có thể bạn sẽ gặp vấn đề tương tự ở đầu bên kia. Trong trường hợp đó, bạn có thể đảo ngược quá trình trước khi nén các tệp -UU, vì có thể rất khó khắc phục ở cuối Windows.


Tôi đoán điều này sẽ phải làm vì tập tin ZIP mà tôi đang tìm kiếm đã biến mất, vì những lý do không liên quan ở đây. Cảm ơn, sẽ làm điều này vào lần tới và hy vọng điều tốt nhất.
einpoklum - phục hồi Monica

1
rarhoặc p7ziptừ chối xử lý tài liệu lưu trữ .zip. Có cách nào để trích xuất một kho lưu trữ với tên tệp trong mã hóa độc quyền, trên Linux không? Khi tôi giải nén unzip, tôi gặp lỗi: "lỗi: không thể tạo ╨и╨╕╨┐ / Ship_╨п ╨Я╤╨Я╤╨Я╤ ╨╛╤З╨╗╨░╨Я╤╨╛╨╛ ▓╨Ю╨┤╨╜╨╛╨╣ ╨Ъ╨╜╨╕╨╢╨║╨╡! .Png Tên tệp quá dài "
Nickolai Leschov

Tôi đã quản lý để giải nén tệp .zip chính xác với LANG=ru_RU.CP1251; unzip Bleed.zip(đó là mã hóa Cyrillic trong trường hợp của tôi). Bây giờ tôi tự hỏi làm thế nào để tôi thiết lập hệ thống của mình để tôi có thể mở chính xác các tệp .zip đó trong GUI?
Nickolai Leschov

@NickolaiLeschov Đặt câu hỏi và ai đó có thể giúp bạn. Có lẽ bạn sẽ cần cung cấp thêm thông tin về hệ thống của bạn.
Michael Homer

unzip -UU foo.ziplàm việc cho các nhân vật Thổ Nhĩ Kỳ
Mert S. Kaplan

8

Tôi đã thành công với lệnh 7z x <source.zip>.

Phiên bản:

p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,[...])

Môi trường có liên quan:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_CTYPE=UTF-8

Nó có thể giải nén tất cả các tệp có ký tự 8 bit trong tên tệp của họ, với một số ký tự bị bỏ qua, một số bị cắt xén.


p7zip là người duy nhất làm việc cho tôi
alex88

6

Tôi cũng gặp vấn đề tương tự, và hóa ra phiên bản unzipđó có sẵn từ kho Ubuntu ( UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.) có thể xử lý tự động giải mã tên tệp nếu bạn chỉ định công -atắc.

unzip -a stupid.zip

+1 mặc dù tôi không có gì để kiểm tra điều này ngay bây giờ.
einpoklum - phục hồi Monica

1
Theo man page của unzipcác -aswitch sẽ chăm sóc của chuyển đổi tập tin văn bản. Không phải tên tập tin.
beruic

@beruic, tôi đã giải nén các số unicode dưới dạng tên tệp (# U + 0040 # U + 0050 ...), và sau đó "giải nén -a" thực sự hữu ích.
thay đổi

1
Tôi đã thử điều này trên một số manga. Tên tệp được giải mã chính xác, nhưng hình ảnh cũng được hiểu là văn bản (!) Và bị hỏng hoàn toàn. Nó thậm chí còn diễn giải các tệp zip và rar bên trong kho lưu trữ dưới dạng văn bản, việc phát hiện là hoàn toàn vô dụng.
rjh

2

Tôi đã có một vấn đề tương tự với việc giải mã một kho lưu trữ zip với các ký tự cyrillic. Một kịch bản python một dòng đã thực hiện đúng công việc:

#!/usr/bin/python

import zipfile
import sys

zipfile.ZipFile(sys.argv[1], 'r').extractall(sys.argv[2] if len(sys.argv) > 2 else '.')

Sau đó, chỉ cần gọi nó unzip_encvà gọi nóunzip_enc ZIP_FILE [TARGET_DIR]

Đối với tôi không phải là unzip -UU, unzip -avà cũng không LANG*biến môi trường đã làm bất kỳ tốt.


Tôi sẽ thử lần sau khi tôi có một tệp zip như vậy để giải nén ... cảm ơn. Nhưng - bạn có thể thay đổi tập lệnh của mình để: 1. kiểm tra xem có hai đối số 2. giải nén vào thư mục làm việc hiện tại không nếu chỉ cung cấp tệp zip?
einpoklum - phục hồi Monica

2

Tôi đã có may mắn với sự kết hợp này:

export LANG=es_MX 
7z x file.zip
convmv -f cp437 -t utf8 -r .

thêm - chú ý đến confmv để đổi tên thực tế. Sau này tôi còn tìm thấy phiên bản tốt hơn:

LANG=es_MX.cp437 unzip -UU file.zip
convmv -f cp437 -t utf8 -r . --notest

+1 chỉ dành cho convmv và công cụ 7zip dòng lệnh.
einpoklum - phục hồi Monica

Có lẽ người ta phải thử các tùy chọn khác nhau cho LANGbiến và từ mã hóa tùy thuộc vào tệp trong tay. Tôi đã có một tập tin LANG=ru_RU.CP1251cùng với -f cp866làm việc.
Dmitri Chubarov

0

Tôi đã lưu trữ zip được nén trong Linux (từ dòng lệnh) và tên tệp có ký tự dấu phụ không được giải nén chính xác trên Windows, nhưng tôi đã giải nén nó bằng phần mềm Bandizip có thể đặt bảng mã trên thanh công cụ.

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.