The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Работа с русскими именами файлов в ZIP и UNZIP под *nix
Одна из неожиданных проблем, возникающих при обмене файлами с пользователями
Windows - странное поведение ZIP-архивов. Казалось бы, достаточно правильно
настроить кодировки... Не тут-то было!

Для текстовых файлов достаточно найти редактор с выбором кодировки, для дисков
можно указать кодировку при монтировании, более "продвинутые" форматы архивов
(RAR, 7zip) тоже как-то решают эту проблему; и только ZIP, самый
распространённый и "самый совместимый" архиватор, почему-то неожиданно
оказывается несовместимым в принципе, стоит именам файлов выйти за пределы ASCII.

Есть мнение, что в архивы ZIP имена файлов пишутся в кодировке файловой
системы, и дескать, отсюда и проблемы - в Windows одна кодировка, а в Linux
другая. И виноват в том устаревший архивный формат и сделать с этим ничего
нельзя, а если очень хочется - переименовывать распакованные файлы скриптами и
прочими костылями. Что ж, попробуем.

Однако попытка увидеть имена файлов путём перекодировки вида

   ls -N | iconv -f cp866

заканчивается провалом. Ладно, не подошла 866, перебираем все известные русские
кодировки и все виды юникода - имена файлов остаются нечитаемыми. Что же это за
кодировка такая в зипе?!

Поиски в сети дают результат - оказывается, надо так:

   ls -N | iconv -f cp1252 -t cp850 | iconv -f cp866

Перекодировать распакованные файлы в utf-8 можно следующей командой:

   find . -type f -exec sh -c 'np=`echo {}|iconv -f cp1252 -t cp850| iconv -f cp866`; mv "{}" "$np"' \;

Битые имена файлов уходят, остаётся вопрос - неужели в зипе правда такая
странная кодировка? Что-то сомнительно.

Ищем дальше и натыкаемся на разгадку. http://www.linuxfromscratch.org/blfs/view/cvs/general/unzip.html

"The UnZip package assumes that filenames stored in the ZIP archives
created on non-Unix systems are encoded in CP850, and that they should be
converted to ISO-8859-1 when writing files onto the filesystem. Such
assumptions are not always valid. In fact, inside the ZIP archive, filenames
are encoded in the DOS codepage that is in use in the relevant country, and the
filenames on disk should be in the locale encoding. In MS Windows, the
OemToChar() C function (from User32.DLL) does the correct conversion (which is
indeed the conversion from CP850 to a superset of ISO-8859-1 if MS Windows is
set up to use the US English language), but there is no equivalent in Linux.

When using unzip to unpack a ZIP archive containing non-ASCII filenames, the
filenames are damaged because unzip uses improper conversion when any of its
encoding assumptions are incorrect. For example, in the ru_RU.KOI8-R locale,
conversion of filenames from CP866 to KOI8-R is required, but conversion from
CP850 to ISO-8859-1 is done, which produces filenames consisting of
undecipherable characters instead of words (the closest equivalent
understandable example for English-only users is rot13)."

Другими словами, имена файлов в ZIP-архиве хранятся в кодировке DOS,
соответствующей языку локали. В Windows эта кодировка может быть получена
соответствующей функцией, а для прочих систем авторы Info-ZIP решили не
возиться и схалтурили - сделали безальтернативное преобразование cp850=>cp1252.
Вот, где зарыта собака! Нет никакой "уникальной кодировки ZIP", там обычная 866
(для русской локали). Во всём прочем виноват не устаревший формат, а версия
unzip от Info-ZIP для *nix, которая неправильно работает со всеми локалями,
отличными от западноевропейских. Что делать?

Патчить. Можно, конечно, обойтись разовым переименованием, но только в разовых
случаях. Если такие архивы встречаются часто, или их надо создавать, выбора не
остаётся, нужен нормальный инструмент, а не костыли. В сети есть разные патчи
для zip и unzip от разных авторов и для различных версий, однако многие из них
устарели, а некоторые небеспроблемны. Я остановился на патчах от АльтЛинукса.

Проблему определения кодировки DOS они решили путём использования своей библиотеки 
libnatspec, которую перед этим придётся установить, брать можно тут: http://sourceforge.net/projects/natspec/
После её установки актуальные кодировки локали можно проверить командой

   natspec -i

Патч для unzip-6.0 подошел почти гладко, осталось исправить только две мелких
детали. Патчи для zip оказались для предыдущей версии, поэтому пришлось
повозиться немного больше, однако оно того стоило - теперь я могу спокойно
распаковывать созданные в Windows zip-архивы просто командой unzip, и точно так
же упаковывать командой zip, не опасаясь битой кодировки на том конце.

Итак, качаем исходник последней стабильной версии unzip
unzip60.tgz и
исправленную версию патча unzip60-natspec-mod.diff.gz, распаковываем
исходник, переходим в его директорию, патчим, собираем и устанавливаем:

   zcat ../unzip60-natspec-mod.diff.gz | patch -p1
   make -f unix/Makefile generic_gcc

и от рута

   make -f unix/Makefile install

После этого unzip должен правильно распаковывать zip-архивы с русскими именами
файлов, и правильно же выводить их в консоли.

Теперь то же самое с zip - берём последнюю версию
zip30.tgz, и к нему мой патч
natspec-asdos-mod.diff.gz.
Распаковываем исходник, и в его директории:

   zcat ../zip30-natspec-asdos-mod.diff.gz | patch -p1
   make -f unix/Makefile generic_gcc

и от рута

   make -f unix/Makefile install

Теперь мы можем упаковывать zip-архивы в виде, полностью совместимом с
проводником Windows и даже с TotalCommander. С последним оказалось, как ни
странно, даже больше проблем - он требовал архив не просто в кодировке DOS, а
непременно с именами в формате DOS, часть патча "asdos" именно для этого. Что
особенно забавно, в TotalCommander использован код всё того же проекта Info-ZIP.

Возможно, некоторые спросят - зачем столько возни с этим морально устаревшим
зипом, когда полно приличных архиваторов на любой вкус? Ответ - для
совместимости, больше ни для чего ZIP и не нужен. А раз так, то пускай он
делает своё дело как надо, а не как всегда :)
 
30.11.2010 , Автор: Natrio
Ключи: zip, rus, patch / Лицензия: CC-BY
Раздел:    Корень / Пользователю / Русификация

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Natrio (?), 23:16, 30/11/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Чуть не забыл – ссылки оригинальные патчи от AltLinux и их обсуждения:

    http://sisyphus.ru/ru/srpm/Sisyphus/unzip/patches
    http://sisyphus.ru/ru/srpm/Sisyphus/zip/patches
    https://bugzilla.altlinux.org/show_bug.cgi?id=4871
    https://bugzilla.altlinux.org/show_bug.cgi?id=12562

     
     
  • 2.5, iZEN (ok), 02:25, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    > Чуть не забыл – ссылки оригинальные патчи от AltLinux и их обсуждения:
    > http://sisyphus.ru/ru/srpm/Sisyphus/unzip/patches
    > http://sisyphus.ru/ru/srpm/Sisyphus/zip/patches
    > https://bugzilla.altlinux.org/show_bug.cgi?id=4871
    > https://bugzilla.altlinux.org/show_bug.cgi?id=12562

    А в майнстрим Info-ZIP слабо закинуть?


     
     
  • 3.7, Natrio (?), 08:36, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Многие уже пробовали "закинуть" подобные патчи в мэйнстрим Info-ZIP, но их либо отклоняли, либо удаляли в следующей версии. Разработчики Info-ZIP занимаются новой версией формата, рассматривая его как предпочтительный. Авторам же патчей ZIP требуется лишь для совместимости, а для всего остального у них есть другие архиваторы. Взаимопонимания в такой ситуации достичь сложно.
    Тем более с моим английским ;)
     
  • 2.9, john (??), 11:17, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    При распаковке имена на русском
    zipinfo - дает абракадабру или набор '?????'
     
     
  • 3.10, Natrio (?), 11:27, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Оригинальные unzip и zipinfo, будучи собранными с опциями по умолчанию, при выводе в консоль заменяю вопросительными знаками всё, что выходит на пределы ASCII. Есть опция NO_SETLOCALE, которая снимает блокировку, и в моём патче эта опция включена.
    Оригинальный zip при упаковке файлов выводит их имена в консоль в кодировке архива, то есть неправильно. В моём патче это исправлено, и имена выводятся в консоль без изменений.
     
     
  • 4.12, john (??), 13:08, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    > Оригинальные unzip и zipinfo, будучи собранными с опциями по умолчанию, при выводе
    > в консоль заменяю вопросительными знаками всё, что выходит на пределы ASCII.
    > Есть опция NO_SETLOCALE, которая снимает блокировку, и в моём патче эта
    > опция включена.
    > Оригинальный zip при упаковке файлов выводит их имена в консоль в кодировке
    > архива, то есть неправильно. В моём патче это исправлено, и имена
    > выводятся в консоль без изменений.

    Да, это работает - большое спасибо!

     
  • 2.11, Natrio (?), 11:39, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    А это мои патчи (ссфлки есть в тексте статьи):
    http://www.opennet.me/soft/zip_rus/unzip60-natspec-mod.diff.gz
    http://www.opennet.me/soft/zip_rus/zip30-natspec-asdos-mod.diff.gz
     
  • 2.33, sanek (??), 15:04, 12/12/2010 [^] [^^] [^^^] [ответить]  
  • +/

    Zip & русские имена, поможем решить этот баг? Нужна ваша помощь!

    Ребята, многие из вас любят голосовать и так далее, я предлагаю вам сделать полезную для всего сообщества вещь. Необходимо будет потратить всего лишь пару минут на регистрацию и зарегистрироваться на оф. ресурсе
    https://launchpad.net/

    И проголосовать вот за решение этого бага:

    Проголосовать можно здесь:
    https://bugs.launchpad.net/ubuntu/+source/unzip/+bug/580961

    Учитывая что там в баге в комментах идёт мощный срач, просьба НИЧЕГО там не писать, просто нажать ссылку
    Does this bug affect you? И выбрать в выпадающем меню
    Yes, it affects me

    Я уже проголосовал. Ссылка на форум откуда взято- http://forum.ubuntu.ru/index.php?topic=124286.0


     

  • 1.2, Аноним (-), 23:35, 30/11/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Можно просто распаковать в корень уже собранные пакеты unzip от альта с того же сизифа.
     
     
  • 2.6, Natrio (?), 08:28, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Я очень благодарен авторам патчей из AltLinux, и я дал ссылки на оригинал.
    Однако мне пришлось добавить кое-что от себя, чтобы zip и unzip не только правильно обрабатывали файлы, но и правильно выводили имена в консоли. В тексте даны уже мои патчи, сделанные на основе оригинальных.
     

  • 1.3, Anonym (?), 00:04, 01/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Проще отказаться от Zip, чем заниматься пропатчиванием
     
     
  • 2.4, iZEN (ok), 02:24, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Ношу ZIP-архивы с русскими именами файлов, сделанные под Windows, на работу. Там распаковываю, пакую в 7-Zip и приношу домой. :)
     
  • 2.8, Natrio (?), 08:49, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Я могу отказаться от ZIP, но не могу заставить отказаться от него тех, кто приносит/присылает/выкладывает такие архивы, а также тех, у кого никакие другие просто не откроются. ZIP нужен именно для этого.
     
  • 2.22, vovans (ok), 21:51, 02/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    конечно, можно ля-лякать, если с реальными людьми не общаешься... Но задолбёшься каждому объяснять... Не стоит на пустом месте раздражаться и раздражать других. Если есть возможность в течении нескольких минут исправить ситуацию раз и надолго, то нечего мозги компостировать себе и людям.
     

  • 1.13, Andrey Mitrofanov (?), 14:08, 01/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >| iconv -f cp1252 -t cp850 | iconv -f cp866

    Вариант:
    |recode lat1..850,866..
      , может быть,
    |recode -f lat1..850,866..
      , если будет на чём спотыкаться.

    unzip -l $file |recode -f 8859-1..850,866..
    -работает, теперь ждём Совета, какой recode нужен для
    7z l $file | ....

    :)

     
     
  • 2.14, Natrio (?), 14:45, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, у 7z со своими и раровскими архивами всё нормально. А вот зип он распаковывает своеобразно – имена в кодировке cp866, но с лишним левым байтом перед каждым символом.

    Но это всё костыли. Я перед тем, как занялся патчами, сам соорудил два работающих скрипта – один для переименования после распаковки, другой с распаковкой через трубу и сохранение в файле с перекодированным именем. Первый вариант требует заранее подготовить пустой каталог (а в норме unzip распаковывает файлы в любой), второй вариант сопровождается потерей всех даты и времени всех файлов, что тоже не всегда хорошо. И оба совершенно негибкие.

     
     
  • 3.16, x0r (??), 15:55, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    отправте пожалуйста багрепорт
     
  • 2.15, Natrio (?), 15:48, 01/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    По уточнённым данным, 7z (p7zip) под Linux начинает распаковывать zip–архивы в неискаженной кодировке cp866, если указать ему ключ -no-utf16 или установить переменную LC_CTYPE в любое значение, отличное от пустой строки.
     
     
  • 3.25, h31 (ok), 21:29, 03/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Бесполезно. Помогли только патчи от RusXMMS.
     
     
  • 4.38, sergey (??), 13:45, 16/12/2010 [^] [^^] [^^^] [ответить]  
  • +1 +/
    7z l -no-utf16 <fname>.zip | iconv -f cp866
    толькочо проверил
     

  • 1.17, Аноним (-), 06:37, 02/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А AltLinux-у отправили свои улучшенные патчи?
     
  • 1.18, мше (?), 08:53, 02/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > более "продвинутые" форматы архивов

    (RAR, 7zip) тоже как-то решают эту проблему;
    нифига они не решают. вон у меня щас лежит rar, который даже не распаковывается

     
     
  • 2.19, Natrio (?), 09:18, 02/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Чем именно не распаковывается?
    Последнее время появилась новая модификация архивов .rar, и для их распаковки нужна новая версия unrar. Если вы пользуетесь p7zip, то в него она включена, кажется, с 9й версии. Не спрашивайте меня, зачем разработчики winrar это сделали – вопрос к ним :)

    Но к кодировкам всё это отношения не имеет. Не буду говорить за всех, но с 9й версией p7zip у меня не возникает проблем с распаковкой созданных в Windows .rar и .7z архивов, а созданные им под Linux архивы .7z нормально открываются 7zip под Windows.

     
     
  • 3.23, мше (?), 11:45, 03/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    хм... действительно
     

  • 1.20, fank (?), 13:10, 02/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    о, сколько лисапетов сразу

    rusxmms.sf.net

    удивитесь, как грамотные люди давным давно решили все эти проблемы

     
     
  • 2.21, Natrio (?), 16:58, 02/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    ЗдОрово! А патчи для unzip-6.0 и zip-3.0 уже есть?
     
     
  • 3.24, fank (?), 18:48, 03/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    > ЗдОрово! А патчи для unzip-6.0 и zip-3.0 уже есть?

    сарказм? (С) Sheldon Cooper

    видимо, перцу, что это написал, надоело упрашивать дубоватых иностранцев и каждому объяснять, что за зоопарк местные девелоперы изобрели - патчи там скорее всего устарели, но все они описаны и не думаю, что сильно сложно допинать их для новых версий

    заявляется, что патчится все в несколько строк кода

     

  • 1.26, StrangeAttractor (ok), 23:51, 07/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо. А как тут статью плюсануть?
     
  • 1.27, ананим (?), 23:54, 08/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    предпочитаю использовать fuse-zip - man fuse-zip
    fuse-zip - a FUSE filesystem for zip archives with write support
    ....
           If you want to specify character set conversion for file names in archive, use the following fusermount options:
             -omodules=iconv,from_code=$charset1,to_code=$charset2
    ....
    DESCRIPTION
           fuse-zip  is  a  fuse  filesystem,  that enables any program to work with a ZIP archive as though it is a plain directory.  Unlike KIO or Gnome VFS, it can be used in any application without modifications.
           Unlike other FUSE filesystems, only fuse-zip provides write support to ZIP archives.  Also, fuse-zip is faster that all known implementations on large archives with many files.
     
  • 1.28, autopilot (?), 11:47, 10/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Debian 4 Etch + unzip-5.52-9etch1
    на хостинге при распаковке кодировка битая, однако это фиксится в php, кроме одной вредной буквы 'Ш'-большая, которая, как выяснилось, просто проглатывается в процессе распаковки.
    В листинге же эта буква остается.
    Случайно выяснилось, когда залили архив с файликом городка "Шахунья.jpg".

    Рекомендую для проверки патчей и локалей обратить на это внимание.

     
     
  • 2.29, Natrio (?), 11:51, 10/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Проверил – у моих патченых zip и unzip такой ошибки нет.
     

  • 1.30, prof_alex (?), 01:57, 11/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что-то не пойму Собрал unzip из calculate emerge -vp unzip These are the packag... большой текст свёрнут, показать
     
     
  • 2.31, Natrio (?), 09:52, 11/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Чуть выше я уже писал, что unzip/zipinfo, собранный без опции NO_SETLOCALE, при выводе в консоль заменяет все не-ASCII символы вопросительными знаками. Мой патч к unzip
    http://pda.opennet.ru/soft/zip_rus/unzip60-natspec-mod.diff.gz
    как раз и отличается от альтовского патча включением этой опции. Другой способ её включить – задать для сборки unzip переменную окружения
       LOCAL_UNZIP="-DNO_SETLOCALE"
    Опции -I и -O нужны ТОЛЬКО для случаев, когда вам требуется задать кодировки отличные от тех, что выдаёт natspec. Если кодировка архива совпадает с определённой natspec DOS-кодировкой, то никаких дополнительных ключей не требуется:
       $ unzip -l ../test.zip
       Archive:  ../test.zip
         Length      Date    Time    Name
       ---------  ---------- -----   ----
               0  12-03-2010 21:23   тест/
               7  12-03-2010 21:23   тест/эюя
               7  12-03-2010 21:23   тест/абв
              17  12-10-2010 11:49   Шах и мат.txt
       ---------                     -------
              31                     4 files
     

  • 1.32, Forth (??), 14:55, 12/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Использую ваш патч, в unzip появились опции -I и -O и все равно вопросики в консоли. :(
    Система - Fedora 14. Где копать?
     
     
  • 2.34, Natrio (?), 09:14, 13/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Нет у меня федоры, проверить не могу. Могу подсказать следующее:

    1) Мой патч
    http://www.opennet.me/soft/zip_rus/unzip60-natspec-mod.diff.gz
    должен накладываться на оригинальный unzip-6.0 :
    ftp://ftp.info-zip.org/pub/infozip/src/unzip60.tgz

    2) В моём патче включена опция NO_SETLOCALE. Если это так, она должна присутствовать в выводе команды сборки. То есть, после
       make -f unix/Makefile generic_gcc
    в выводе должно часто присутствовать -DNO_SETLOCALE
    Если нет – значит сборка идёт как-то неправильно, или наложенный патч – не мой.

    3) После сборки с моим патчем unzip устанавливается в /usr/bin/
    Возможно, у вас уже установлена другая версия в /usr/local/bin/ , которая обычно имеет более высокий приоритет в переменной $PATH. Если это так, то одна из версий явно лишняя.

     
  • 2.35, Natrio (?), 09:17, 13/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    4) Вопросики только в консоли? Имена распакованных файлов правильные?
     

  • 1.36, Yo (??), 13:56, 13/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    # можно и так:
    zipinfo -1 my.zip | while read z
    do u=$(echo "$z"|iconv -f cp866)
    unzip my.zip "$z" && mv -i "$z" "$u"
    done
     
     
  • 2.37, Natrio (?), 08:43, 14/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Не получится.
    1) Непатченный unzip/zipinfo выводит имена с перекодировкой cp850 => cp1252. Поэтому в вашем примере надо сначала обратить её, а потом уже переводить из cp866 :
       iconv -f cp1252 -t cp850 | iconv -f cp866
    подробности в статье выше.

    2) Во многих дистрибутивах unzip/zipinfo собран БЕЗ опции NO_SETLOCALE, и потому будет выводить в консоль все имена в виде "?????". Перекодировка после этого, естественно, уже невозможна.

     

  • 1.39, pva0xd (ok), 17:38, 23/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Natrio, а не могли бы вы пояснить в каких случаях нужена опция -K? И вообще зачем изменёно умолчание для dosify?
     
     
  • 2.41, Natrio (?), 12:55, 24/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Опция -K обратна опции -k, то есть отключает "dosify".
    Умолчание изменено для совместимости с win-програмами. В частности, TotalCоmmander не видит русских имён файлов, если архив упакован БЕЗ опции dosify.
     

  • 1.40, RUR (?), 12:51, 24/12/2010 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    По мотивам Yo, создаём бат файл:

    echo 'zipinfo -1 $1 | while read z; do u=$(echo "$z"|iconv -f cp1252 -t cp850|iconv -f cp866); unzip $1 "$z" && mv -i "$z" "$u"; done' > brusunzip

    chmod +x brusunzip

    brusunzip my.zip

     
     
  • 2.42, Natrio (?), 13:01, 24/12/2010 [^] [^^] [^^^] [ответить]  
  • +/
    Я начинал именно с таких скриптов, только получаются они очень неуклюжими. Кроме того, zipinfo, будучи собранным без дополнительных опций (у меня так и было), НЕ ВЫВОДИТ русские имена в консоль, заменяя их на ?????, то есть эти скрипты на половине систем не будут работать без пересборки пакета unzip. А если уж пересобирать, то я решил лучше пропатчить и больше не мучаться со скриптами.
     

  • 1.43, lucentcode (ok), 01:49, 07/04/2011 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    C unzip 6.0.1 вы можете использовать опцию -O cp866 когда надо распаковать файл, пожатый в windows.
     
     
  • 2.44, aleks (??), 23:10, 03/03/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > C unzip 6.0.1 вы можете использовать опцию -O cp866 когда надо распаковать
    > файл, пожатый в windows.

    В ман не нашел такой опции

     

  • 1.45, aleks (??), 23:13, 03/03/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ну и в догонку под bsd 7.3 отлично работает такой способ например:
    7z e -no-utf16 jtv.zip
    convmv -f cp866 -t koi8-r * --notest
     
     
  • 2.46, Natrio (?), 23:37, 03/03/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Возможно, но статья не об этом, а о том, как НОРМАЛЬНО работать в *nix с ОБЫЧНЫМИ, то есть DOS/Win zip-архивами.
     
     
  • 3.47, aleks (??), 02:10, 04/03/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Ок, поясню.
    В приведенном мною примере jtv.zip архив тот самый виндовый архив,
    при распаковке unzipом оного можно увидеть кривую кодировку названий файлов.
    Приведенный мною пример как раз показывает как можно НОРМАЛЬНО работать с такими архивами.
     
     
  • 4.48, Natrio (?), 08:51, 04/03/2012 [^] [^^] [^^^] [ответить]  
  • +/
    В статье выше тоже приводятся примеры таких костылей, только это не называется "нормально работать". Это называется "перекодировать кривую кодировку имён файлов после распаковки", это ДАВНО ИЗВЕСТНО, и статья совсем не об этом.
    В статье предлагается пропатчить zip и unzip, чтобы имена файлов всегда правильно упаковывались и распаковывались.
       zip -r фрхив.zip файлы и каталоги
       unzip архив.zip
    Также после этого можно использовать GUI-шные оболочки, которые используют zip и unzip для упаковки и распаковки.
    Мне известны пакеты с этими патчами для ubuntu/debian
    https://launchpad.net/~frol/+archive/zip-i18n
    и для ArchLinux:
    http://aur.archlinux.org/packages.php?ID=47921
    https://aur.archlinux.org/packages.php?ID=47920
     
     
  • 5.49, aleks (??), 20:32, 04/03/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Эта статья как раз из серии "а  мыши кололись, плакали, но продолжали жрать кактус" как ни посмотри.

    > В статье предлагается пропатчить zip и unzip, чтобы имена файлов всегда правильно
    > упаковывались и распаковывались.

    Да вот это и есть костыли. ППЦ сделать костыли для костылей. Зачем?

    Есть нормальный продукт 7z где уже из "коропки" все распаковывается и тут же можно перевести в нужную кодировку, замечу без всяких патчей и прочей заумной мути.
    Просто написать одну строчку и вуаля. Куда проще то?
    Нет, конечно, можно с умным видом ложить патчи какие-то чето там пересобирать и еще держать в уме а как же на других серваках не забыть потом это все проделать или помнить... Бред.
    Не работает это глюкалово unzip ну и нафиг его есть другие инструменты которые могут это сделать быстро и парой команд.

     
     
  • 6.53, Хрен с горы (?), 16:26, 15/09/2013 [^] [^^] [^^^] [ответить]  
  • +/
    Люто, бешено плюсую.
    7z спасёт отцов русской демократии.
     

  • 1.50, Ю.Т. (?), 13:37, 15/12/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Да, это полезный совет Всё верно Пока существуют винды и WinZip и InfoZip,... большой текст свёрнут, показать
     
     
  • 2.51, Natrio (?), 14:05, 15/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Не так уж всё и сложно :)

    Что касается "сопровождения", то дистрибутивы, как правило, позволяют собирать не только вручную, но и собирать пакеты, или подключать сторонние репозитории.
    После установки пакетов их "сопровождение" ничем не отличается от всех прочих, а работа с ними – от работы со оригинальными zip и unzip, независимо от программ, которые их вызывают.

    Для себя в ArchLinux я собрал пакеты, заменяющие zip и unzip, и положил в AUR:
    http://aur.archlinux.org/packages/zip-natspec/
    http://aur.archlinux.org/packages/unzip-natspec/
    Для Убунты (к Дебиану тоже подходят) мои пакеты собрали без меня :)
    http://launchpad.net/~frol/+archive/zip-i18n
    Насчёт других дистров не знаю, но в случае чего можно поступить аналогично.

    А кодировку libnatspec определяет самостоятельно, на основе языка локали. Если запустить с другой локалью, будет выбрана другая кодировка.
    Юникодные архивы альтернативного формата infozip будут распаковываться как обычно, на это патчи не влияют.

     
     
  • 3.52, Ю.Т. (?), 14:33, 15/12/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Не так уж всё и сложно :)
    > Что касается "сопровождения", то дистрибутивы, как правило, позволяют собирать не только
    > вручную, но и собирать пакеты, или подключать сторонние репозитории.
    > После установки пакетов их "сопровождение" ничем не отличается от всех прочих, а
    > работа с ними – от работы со оригинальными zip и unzip,
    > независимо от программ, которые их вызывают.

    ...

    Ну-с, что кому кажется сложным или простым, тема вечная. По-моему, основывать решение на доп. библиотеке, которая угадывает (!) кодировку, это уже ошибка. А не угадает, тогда как? Или вот тут предлагали: то шелл-скрипты, то в два действия архив раскрывать.

    Да вообще работа со сложно-уложенной информацией в консоли это скорее упражнение в йоге, но не работа. :)

     

  • 1.54, uropb (??), 15:45, 21/01/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Для меня лично наиболее удобным оказался вариант с mc. Миднайт командер, оказывается, нормально заходит в архивы с русскими именами. При копировании из архива в нужную директорию русские имена сохраняются. И никаких патчей.
     
  • 1.55, x230 (ok), 16:47, 21/06/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В Manjaro KDE (в dolphin) такая проблема решилась после того, как я сделал следующее:

    # Удалил:
    zip
    unzip

    # Установил:
    zip-natspec
    unzip-natspec
    libnatspec

     
  • 1.56, Аноним (56), 17:01, 23/06/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я тут патчики написал к unzip и p7zip, которые раз и навсегда решают проблему с кодировками windows-архивов.

    Вот тут всё лежит:
    https://github.com/unxed/oemcp

     
  • 1.57, Лев (?), 18:30, 05/09/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Привет из будущего! Столкнулся с этой столетней проблемой, когда запускал unzip по SSH через PHP из-под WSL Win10 😳 Оказалось, что локаль консоли удаленного хоста зависит от локали локального хоста (и от настроек SSH), поэтому у меня при подключении из-под Windows была локаль C.UTF-8, а из-под соседних linux'ов en_US.UTF-8, и соответственно из-под linux все было нормально, имена файлов после unzip отображались корректно, а из-под windows - знаки вопроса.
    Так что достаточно просто поменять локаль на en_US.UTF-8 или ru_RU.UTF-8. Надеюсь кому-то поможет.
    php -r "print_r(shell_exec(\"ssh user@host 'LANG=ru_RU.utf8 && unzip filename.zip'\"));"
     
  • 1.58, Аноним (56), 14:48, 12/10/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Удивительно, насколько ни один из архиваторов в ключая unzip на linux не в сос... большой текст свёрнут, показать
     
     
  • 2.59, Аноним (56), 15:15, 12/10/2020 [^] [^^] [^^^] [ответить]  
  • +/
    На самом деле, алгоритм там чуууточку сложнее, ведь ещё и в ANSI зипы встречются (но чтоб без дублирования в UTF8 - исключительно редко). В скрипте ziplist это учитывается, совсем идеальный алгоритм можно подсмотреть там.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру