| Summary: | CP866.zip | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | kessys <nfsmobile> |
| Component: | libnatspec | Assignee: | 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
Ошибка происходит при использовании unzip в ark. Кто больше причастен, unzip или libnatspec -- не знаю. Выяснилось, что архив явно кривой. В нём указано, что он создан в UNIX, а кодировка имён файлов CP866. "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, которая неправильно работает со всеми локалями, отличными от западноевропейских. Что делать? Из описания по первой ссылке В данном архиве, во вложенном файле (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. (Ответ для kessys на комментарий #3) > Нет никакой "уникальной кодировки ZIP" Есть, но в архиве должно быть явно указано, что там UTF-8. (Ответ для kessys на комментарий #3) > Что делать? В случае, если не указано, что UTF-8, гадать разными natspec, enca и т.п.. |