Як я можу правильно розпакувати ZIP-архів файлів із івритськими іменами?


18

Хтось надіслав мені файл ZIP, що містить файли з івритськими іменами (і створений у Windows, не впевнений, за допомогою якого інструменту). Я використовую LXDE на Debian Stretch. Менеджеру архівів Gnome вдається розпакувати файл, але єврейські символи є прихованими. Я думаю, я отримую октети UTF-8, розширені на символи Unicode, наприклад, у мене є файл, ім'я якого містить чотири символи, а .doc достатньо, а символи: 0x008E 0x0087 0x008E 0x0085. Використання утиліти unzip для командного рядка ще гірше - вона відмовляється повністю розпаковувати, скаржившись на "Недійсний або неповний багатобайтовий або широкий символ".

Отже, мої запитання:

  • Чи є інша утиліта декомпресії, яка розпакує мої файли з правильними іменами?
  • Щось не так із способом стиснення файлу чи це просто несумісність реалізацій ZIP? Або навіть неправильне використання / помилка утиліти Linux ZIP?
  • Що я можу зробити, щоб отримати правильні імена файлів після того, як розпакували їх за допомогою накреслених?

Якщо ви шукаєте ці байти у таблиці cp862, чи відповідає ім'я файлу тому, що ви очікуєте? Інакше ви знаєте кодування коду вихідної машини?
Майкл Гомер

Ditto для cp1255 та будь-яких інших правдоподібних кодувань; можливо, це можливо просто розробити на основі того, що виглядає правильно.
Майкл Гомер

@MichaelHomer: Ні, це не схоже на відповідність. Нативне кодування вихідної машини - це те, що використовує MS Windows, коли ви встановлюєте регіональні параметри на іврит-Ізраїль, тому я думаю, що іноді це UTF-8, а іноді CP1255.
einpoklum

Відповіді:


15

Здається, що імена файлів кодуються в одній із власних кодових сторінок Windows ( CP862 , 1255 тощо).

  • Чи є інша утиліта декомпресії, яка розпакує мої файли з правильними іменами? Мені не відомо про утиліту zip, яка підтримує ці кодові сторінки. 7z має певне розуміння кодування, але я вважаю, що це має бути кодування, про яке ваша система знає загалом (ви вибираєте це, встановивши LANGзмінну середовища), і кодові сторінки Windows, швидше за все, не є серед них.

    unzip -UUслід працювати з командного рядка, щоб створити файли з правильними байтами в своїх іменах (відключивши всю підтримку Unicode). Це, мабуть, ефект, який ви вже отримали від інструменту GNOME. Кодування не буде правильним в будь-якому випадку, але ми можемо виправити це нижче.

  • Щось не так із способом стиснення файлу чи це просто несумісність реалізацій ZIP? Або навіть неправильне використання / помилка утиліти Linux ZIP? Файл, який вам було надано, не створювався портативно. Це не обов'язково неправильно для внутрішнього використання, коли кодування зафіксовано та відомо заздалегідь, хоча специфікація формату говорить, що імена повинні бути або UTF-8, або cp437, а ваші - ні. Навіть між машинами Windows використання різних кодових сторінок не спрацьовує, але машини, які не працюють з Windows, не мають концепції цих сторінок коду. Більшість інструментів UTF-8 кодують свої імена файлів (що все ще не завжди достатньо, щоб уникнути проблем).

  • Що я можу зробити, щоб отримати правильні імена файлів після того, як розпакували їх за допомогою накреслених? Якщо ви можете ідентифікувати кодування файлових файлів, ви можете перетворити байти в існуючих іменах в UTF-8 і перемістити існуючі файли до потрібного імені. Інструмент по суті завершує цей процес в одну команду: намагатиметься конвертувати всі всередині від cp862 в UTF-8.convmvconvmv -f cp862 -t utf8 -r ..

    Крім того, ви можете використовувати iconvта findпереміщувати все до їх правильних назв. Щось на зразок:

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

    знайде всі файли під поточним каталогом і спробує перетворити імена в UTF-8.

    В будь-якому випадку ви можете експериментувати з різними кодуваннями і спробувати знайти те, що має сенс.


Після виправлення кодування для вас, якщо ви хочете відправити ці файли назад в іншому напрямку, можливо, у вас буде та сама проблема на іншому кінці. У такому випадку ви можете змінити процес перед тим, як зібрати файли -UU, оскільки це, ймовірно, буде дуже важко виправити на кінці Windows.


Я думаю, що це доведеться робити, оскільки ZIP-файл, який я шукав, зараз відсутній, ну, причин тут не має значення. Дякую, зробимо це наступного разу та сподіваюся на найкраще.
einpoklum

1
rarабо p7zipвідмовитись від обробки .zip архівів. Чи є спосіб витягнути архів із назви файлів у власні кодування в Linux? Коли я витягую з unzip, я отримую помилку: "помилка: не вдається створити ╨и╨╕╨┐ / Ship_╨п ╨Я╤А╨╛╤З╨╗╨░ ╨Я╤А╨╛ ╨н╤В╨╛ ╨ ▓╨▓╨╨┤╨╜╨╛╨╣ ╨Ъ╨╜╨╕╨╢╨║╨╡! .Png Ім'я файлу занадто довго "
Микола Лещов

Мені вдалося правильно витягнути .zip файл LANG=ru_RU.CP1251; unzip Bleed.zip(в моєму випадку це було кодування кирилицею). Тепер мені цікаво, як я можу налаштувати свою систему, щоб я міг правильно відкривати такі .zip файли у графічному інтерфейсі за замовчуванням?
Микола Лещів

@NickolaiLeschov Задайте питання, і хтось, можливо, зможе вам допомогти. Можливо, вам потрібно буде надати більше інформації про вашу систему.
Майкл Гомер

unzip -UU foo.zipпрацював на турецьких персонажів
Мерт С. Каплан

8

Я мав успіх у командуванні 7z x <source.zip>.

Версія:

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

Потенційно релевантне середовище:

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

Він зміг розпакувати всі файли з 8-бітовими символами у своїх іменах, при цьому деякі з цих символів були пропущені, а деякі зітхнені.


p7zip - єдиний, хто працював на мене
alex88

6

У мене щойно виникала така ж проблема, і виявляється, що моя версія цієї версії unzip, доступна у сховищах Ubuntu ( UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.), може обробляти автоматичне розшифровку імен файлів, якщо вказати -aкомутатор.

unzip -a stupid.zip

+1, хоча зараз мені нема чого це перевірити.
einpoklum

1
За словами чоловіка сторінці unzipв -aкомутаторі доглядає перетворення текстових файлів. Не імена файлів.
Беруїк

@beruic, у мене були розпаковані номери Unicode як імена файлів (# U + 0040 # U + 0050 ...), і тоді "unzip -a" справді допомогло.
chang

1
Я спробував це на якійсь манзі. Назви файлів були розшифровані правильно, але зображення також були інтерпретовані як текст (!) Та повністю зіпсовані. Він навіть інтерпретує zip та rar файли всередині архіву як текст, виявлення абсолютно марно.
rjh

2

У мене була схожа проблема з розшифровкою zip-архіву кирилицями. Однорядковий сценарій python виконав цю роботу належним чином:

#!/usr/bin/python

import zipfile
import sys

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

Тоді просто зателефонуйте unzip_encі зателефонуйтеunzip_enc ZIP_FILE [TARGET_DIR]

Для мене ні змінні unzip -UU, unzip -aні LANG*середовища не принесли користі.


Я спробую, що наступного разу, коли я отримаю такий поштовий файл ... спасибі. Але - чи можете ви змінити свій скрипт так, щоб: 1. перевірити, чи є два аргументи 2. витягнути в поточний робочий каталог, якщо надається лише zip-файл?
einpoklum

2

Мені пощастило з цим поєднанням:

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

add --notest до convmv для фактичного перейменування. Пізніше я знайшов ще кращу версію:

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

+1 просто для convmv та інструмента 7zip командного рядка.
einpoklum

Ймовірно , один має спробувати різні варіанти LANGзмінні і з кодують в залежності від файлу під руку. У мене є файл, де LANG=ru_RU.CP1251разом з -f cp866працювали.
Дмитро Чубаров

0

У мене архіви zip, стиснуті в Linux (з командного рядка), і назви файлів з символами діакритики неправильно декомпресуються в Windows, але я вдало розпакував його за допомогою програмного забезпечення Bandizip, яке може встановити схему на панелі інструментів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.