Bug 54258

Summary: CP866.zip
Product: Sisyphus Reporter: kessys <nfsmobile>
Component: libnatspecAssignee: Vitaly Lipatov <lav>
Status: NEW --- QA Contact: qa-sisyphus
Severity: normal    
Priority: P4 CC: lav, proskurinov, zerg
Version: unstable   
Hardware: x86_64   
OS: Linux   
See Also: https://bugzilla.altlinux.org/show_bug.cgi?id=53725

Description kessys 2025-05-14 11:23:53 MSK
https://www.opennet.ru/tips/2494_zip_rus_patch.shtml
На госпорталах таких как фабрикант используется CP866.
Ark не умеет распаковывать правильно кодировку
https://disk.yandex.ru/d/xXzrqZ39k6BaBg
Comment 1 Sergey V Turchin 2025-05-23 10:59:09 MSK
Ошибка происходит при использовании unzip в ark.
Кто больше причастен, unzip или libnatspec -- не знаю.
Comment 2 Sergey V Turchin 2025-07-15 15:35:27 MSK
Выяснилось, что архив явно кривой. В нём указано, что он создан в UNIX, а кодировка имён файлов CP866.
Comment 3 kessys 2025-07-15 15:58:49 MSK
"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, которая неправильно работает со всеми локалями,
отличными от западноевропейских. Что делать?

Из описания по первой ссылке
Comment 4 proskurinov@basealt.ru 2025-07-15 16:09:22 MSK
В данном архиве, во вложенном файле
(CP866/Документы по закупке №0373100115225000027 12.05.2025 13.01.55 (1).zip)
Стоит флаг version made by : UNIX
А кодировка имени файла (Заявки/005 Заявка №1 ...) - CP866
То есть архив "немного странноват" обычные архивы с CP866 и version made by MS-DOS аrk открывает нормально.
То есть никаких "unpredictable symbols" там нет, просто странно что не выставлено флажок MS-DOS.
Comment 5 Sergey V Turchin 2025-07-15 16:42:49 MSK
(Ответ для kessys на комментарий #3)
> Нет никакой "уникальной кодировки ZIP"
Есть, но в архиве должно быть явно указано, что там UTF-8.
Comment 6 Sergey V Turchin 2025-07-15 16:44:46 MSK
(Ответ для kessys на комментарий #3)
> Что делать?
В случае, если не указано, что UTF-8, гадать разными natspec, enca и т.п..