Как правильно распаковать архив ZIP с именами на иврите?

18

Кто-то прислал мне ZIP-файл, содержащий файлы с ивритскими именами (и созданный в Windows, не уверен, каким инструментом). Я использую LXDE на Debian Stretch. Менеджер архивов Gnome распаковывает файл, но ивритские символы искажены. Я думаю, что я получаю октеты UTF-8, расширенные до символов Юникода, например, у меня есть файл, имя которого состоит из четырех символов и достаточного .doc, и символы: 0x008E 0x0087 0x008E 0x0085. Использование утилиты unzip из командной строки еще хуже - она ​​вообще отказывается распаковывать, жалуясь на «недопустимый или неполный многобайтовый или широкий символ».

Итак, мои вопросы:

  • Есть ли другая утилита распаковки, которая распаковывает мои файлы с правильными именами?
  • Что-то не так с тем, как файл был сжат, или это просто несовместимость реализаций ZIP? Или даже ошибка / ошибка в утилитах Linux ZIP?
  • Что я могу сделать, чтобы получить правильные имена файлов после распаковки, используя искаженные?
einpoklum
источник
Если вы посмотрите эти байты в таблице cp862, соответствует ли имя файла тому, что вы ожидаете? В противном случае, вы знаете родную кодировку исходного компьютера?
Майкл Гомер
То же самое для 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 и переместить существующие файлы в правильное имя. Поconvmv сути, инструмент объединяет этот процесс в одну команду: convmv -f cp862 -t utf8 -r .он попытается преобразовать все, что находится внутри, .из cp862 в UTF-8.

    В качестве альтернативы вы можете использовать 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, я получаю ошибку: «ошибка: не могу создать createи╨╕╨┐ / 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-битными символами в именах файлов, некоторые из них были пропущены, некоторые искажены.

vszakats
источник
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, я разархивировал номера юникода в качестве имен файлов (# U + 0040 # U + 0050 ...), а затем «unzip -a» действительно помогло.
Чан
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*переменные среды не принесли пользы.

Искрен Ивов Чернев
источник
Я попробую это в следующий раз, когда у меня будет такой zip-файл для извлечения ... спасибо. Но - не могли бы вы изменить свой скрипт так, чтобы: 1. проверить, есть ли два аргумента; 2. извлечь в текущий рабочий каталог, если указан только zip-файл?
einpoklum
2

Мне повезло с этой комбинацией:

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

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

LANG=es_MX.cp437 unzip -UU file.zip
convmv -f cp437 -t utf8 -r . --notest
asdjfiasd
источник
+1 только для convmv и инструмента командной строки 7zip.
einpoklum
Вероятно , один должно попробовать различные варианты LANGпеременные и из кодирующих в зависимости от файла под руку. У меня есть файл, где LANG=ru_RU.CP1251вместе с -f cp866работал.
Дмитрий Чубаров
0

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

Миро Юнкер
источник