-
Notifications
You must be signed in to change notification settings - Fork 173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
multiarc rearrangement #775
Comments
see comment on #773 |
For archives creation/modification we can use: btw, собрал в табличку поддержку .zip разным софтом вот. Помимо всего этого есть ещё libzip, она как minizip, но с поддержкой шифрованных зипов; возможности задавать свою кодировку для OEM архивов тоже нет. |
i guess bug can be closed now? |
It's about unar, not unrar. It's two completely different tools :) I suggested unar as general purpose unpacking solution with good charset support, not only to fix .rar problems. |
btw, просьба глянуть ПР #766 — я там избавился от повторных вызовов zip/unzip, правильная кодировка сразу теперь задается (препроцессор-то зипный её ведь знает, раз файл смог показать правильно). И ещё там удаление файлов из архивов в ANSI кодировке (редко, но встречаются) поправлено. |
Не нравится мне такая массированная инкостыляция. |
Здорово, если это сработает :) btw, зипы ещё и ANSI'шные бывают. Нужно тогда смотреть, какую кодировку выбрал препарсер, и такую и выставлять. Кстати, в определении ANSI'шных архивов в препарсере сидит бага: вместо Ещё кстати, преобразование локаль -> кодовая страница для ANSI в этом же PR лежит ;-) UPD 2024-05-26: В архивах WinZip с ANSI есть и Unicode поля, там ANSI использовать не надо. |
Ух ты!
А это можно где-нибудь потрогать? Ну в бранче там ;) |
|
или втянуть код определения кодировки в обработчик libarch |
Погонял! Здорово :) Обнаруженные проблемы: — три файла из моего тестового набора пока что не распаковывает (23-10-2012-b-fasi-eaep_greek.zip, macos.zip и new2.zip) |
Для всех трех проблемных файлов отключение hdrcharset решает проблему. То есть вот комментишь То есть, простейшим решением тут будет в случае ненахода нужного файла в архиве делать retry с отключенной hdrcharset.
Хотя так, конечно, было бы прикольнее. |
Ещё: для .tar.gz вообще не надо по умолчанию OEM кодировку ставить))) Только для .zip'ов. |
Сделал тут скриптик на Perl'e, повторяющий работу препарсера нашего, и показывающий, чего там живет внутри зипа и по какому принципу имя файла правильно выбирается и декодируется. Очень наглядная штука получилась. Вот, вдруг пригодится https://github.com/unxed/oemcp/blob/master/ziplist И, да, бывают зипы, в которых у разных файлов имена в разных кодировках (на винде создали, на линуксе дописали, скажем). Например, win_and_linux_mixed.zip |
поддопилил improving-libarch ща мона серъезней тестить |
Погонял. Очень здорово! Кое-что странное всё ж нашел, отписался там в каментах к коммиту :) |
если это комент к тому комиту то оно уже не актуально, допилил я именно вот ща |
кстати выбранная на тот момент для чарсета %%S оказалась занята, теперь юзается %%T, то есть надо ресетнуть командлайны. |
Спасибо! Перепроверяю |
Ура, проблемы с удалением файлов из zip архивов ушли! А вот что осталось: И ещё, при удалении (по факту - перепаковке, как я вижу) создаются новые архивы, которые будут не читабельны штатным архиватором винды, потому что OEM-версии имен файлов там нету. Гуманно было бы всё ж писать туда и OEM и UTF8 (0x7075) версии имен файлов, если они пролезают в OEM кодировку (поставив PackOS в 0; если не пролезают в OEM, но пролезают в ANSI, можно использовать её, поставив PackOS в 11 и PackerVer в 20). Собственно, многие современные архиваторы с винды так и делают. А вообще, очень здоровская штука получается! |
|
ошибку на пустых архивах тож пофиксил |
А, ок! Если современная винда с настройками по умолчанию и правда в состоянии нормально открывать такое, то, конечно, можно так и оставить. А пользователи XP пускай сами заботятся о том, чтобы поставить себе 7-zip, который тоже всё прекрасно съест :) Создание .zip.gz и пустые .tar.gz — подтверждаю, исправлено! Круть. Неужели на *nix будет первый менеджер архивов, который правильно обращается с зипами из коробки? Даже не верится :) Надеюсь, по крайней мере, libarchive на всех платформах ведет себя одинаково, а то могут быть неожиданные сюрпризы. |
Думаю на ХР тоже все будет ок, она юникодная внутри - было бы глупо не понимать юникодные зипы. |
Ну что же, зипы классно теперь работают, по-моему :) Workaround для "zip -d" только там остался в коде (для систем со старой libarchive, видимо), и в нём остался баг: Ещё автоопределение ANSI кодировки стоит добавить (табличка тут есть), а то иначе в нерусских локалях в редакторе выбор кодировки выглядит странно: для OEM (DOS) предлагается системная, а для ANSI — всегда кириллическая 1251. Ну и ещё из-за отсутствия учёта ANSI workaround для "zip -d" не может удалить файл отсюда new2.zip. |
Видел последние коммиты, ура! Для "unzip" и "zip -d", кстати, лучше использовать определенную кодировку, а не всегда предполагать OEM. Это исправит удаление из того же new2.zip. То есть, вместо Кстати, а почему условие для определения ANSI именно такое:
? |
Хз почему оно такое изначально - не я писал, а убрал верхнее ограничение потому что это показалось неправильным. Чисто интуитивно :) |
Чисто интуитивно из всех моих тестовых зипов PackOS == 11 есть только в одном, и в нём единственном как раз ANSI. Вот в этом самом new2.zip как раз :) То есть, возможно, там вообще одной проверки на PackOS достаточно. Но хз, как там себя древние архиваторы вели и что куда писали. UPD 2024-05-26: В new2.zip есть и UnicodePath, там поля для однобайтных кодировок вообще использовать не надо. |
то есть вместо >20 поставить >=20? |
ага |
а о верхнем ограничении будем думать, если попадутся примеры, оправдывающие его необходимость :)) |
Во, класс! Теперь, если уж происходит большое наведение порядка в multiarc, осталось разобраться со всякими ace/arc/arj/lhz/ha. Сейчас из них ничего толком не работает. Варианты тут видятся такие: |
либархив наверное многое умеет распаковывать, да, но нужны живые экземпляры архивов для вивесекции |
|
..когданить в светлом будущем, когда илон маск будет похоронен на Фобосе, у far2l появятся функциональные автотесты.. |
arj убунтовый согласился создать архивчик. русские имена файлов сунул туда в utf8, уж не знаю, по стандарту так положено или он просто использует системну кодировку, не разбираясь. lha из jlha-utils согласился создать .lha, но русские буквы упрямо писал туда как ????, поэтому сделал только с английскими пока. остальное искать в сети надо, видимо - попробую сейчас |
примеры arc http://cd.textfiles.com/powerprogramming/PROGTOOL/ARC_LBR/, ну скажем POLIPREF.ZIP источник |
ha более-менее собирается и работает, http://www.ibiblio.org/pub/Linux/utils/compress/ha0999p-linux.tar.gz |
ace: создаётся вот этой тулзой (работает под wine). имена файлов пишет в OEM. пример WinAce.zip |
Вроде, для всех примеры нашёл или смог создать (но вот русские примеры получились не для всех, увы). Тут, конечно, не будет такого многообразия тестовых файлов, как для .zip'ов — с разных систем, с разных упаковщиков. Ну так и форматы не столь популярные — хоть как-нибудь распаковывались бы, а для особых случаев есть convmv. |
А, блин! :)) Понял, почему из new2.zip не удаляется с ZIP_LIBARCHIVE 0. Там же есть вторая версия имени файла, в 0x7075. И этот факт сбрасывает Info->Codepage в 0. А консольный zip имена файлов в 0x7075 понимать не хочет, и ждёт имя файла в данном случае в ANSI. UPD: Исправлено в ea8fddc, ура! |
Примеры ace, arc, arj, ha, lha (= lzh) одним архивом И ещё, сюда же. Может быть, стоит чтение/запись 7z и чтение rar на libarch тоже перевести тогда? Чтоб не тащить дополнительный код и не следить за его актуальностью в дальшнейшем. И ещё попытка создать архив .lzh не работает, надо command lines переписать под jlha-utils, он умеет создавать архивы. И ещё извлечение из arj не-корневой папки извлекает всё поддерево. Например, если извлечь "тестовая папка 1" из моего тестового архива, извлечется "test" и уже в ней "тестовая папка 1". |
"чтение/запись 7z и чтение rar на libarch тоже перевести тогда?" не самые древние версии либархивы не умеют в запароленные архиве и думаю другие проблемы могут быть. Пока явных причин переделать нету - пускай остается |
А зачем при создании зипа добавляется вот такое? /home/unxed/runcity/current/2020/1$ "/usr/lib/far2l/far2l" --libexec "/usr/lib/far2l/Plugins/multiarc/plug/multiarc.far-plug |
Оу, странность какая. При попытке создать .zip архив multiarc передает в ^libarch какую-то дичь вместо кодировки:
Локаль ru_RU.UTF-8 На работоспособность это не влияет, но выглядит странно. |
Может не в ту тему, но все же:
Наблюдается на OSX 11.0.1. Файл Temp.zip - создан libarch Стало заметно с переходом от какой-то дремучей версии на HEAD-4766014 |
2Nomad1 в тему, вроде починил |
fixed вродь |
@elfmz |
Native 7zip linux port, wow https://sourceforge.net/p/sevenzip/discussion/45797/thread/cec5e63147/?page=0 |
Consider using unar for archives unpacking in multiarc
Pros:
— support filenames charset specification for OEM archives (-e CHARSET) on ALL platforms (linux, macos, freebsd) — compare with unzip with unpredictable -I/-O options support per OS
— supports password protected archives
— with "retry logic" (doing "-e utf8" and, if it fails, retrying with "-e OEMCP") it processed all my test zips well
— supports .tar.gz correctly, without the need to unpack the whole archive to process single file
— supports bunch of legacy formats like ARJ, ACE, ARC, LZH — currently far2l is unable to unpack them without separate external tools for each
— unar is packaged for almost every OS in the world, including OpenWRT
— and yes, command line unar is LGPL licensed https://en.wikipedia.org/wiki/The_Unarchiver
Cons:
— new dependency (~1,2 Mb .deb size on Ubuntu) (but we can import its sources and build as static library)
— unpacker only, can not add or delete files to/from archives — leaves the need to use separate tools for that
Still with unar we at least can READ all archive formats correctly on ALL platforms without weird charsets problems.
https://theunarchiver.com/
https://theunarchiver.com/command-line
https://www.systutorials.com/docs/linux/man/1-unar/
https://formulae.brew.sh/formula/unar
https://www.freebsd.org/cgi/man.cgi?query=unar&apropos=0&sektion=1
PS: code page names need translation for unar: for example, it treats code page "cp932" as "windows-31j". this is also actual for oem cps 720 (ibm-720_P100-1997), 950 (ibm-950_P110-1999), 949 (windows-949-2000), 874 (windows-874-2000), 1258 (windows-1258). same translation may be needed for ansi CPs.
The text was updated successfully, but these errors were encountered: