CP866 у XXI сторіччі
Aug. 11th, 2022 15:36Вчора батько написав мені імейла з .zip файлом і питанням чому у нього на w10 імена файлів всередині архайву виглядають ієрогліфами.
Для багатьох це є щось нудно знайоме, але мені такого не присилали років 15. Я ніби поринувся ув 2004.
Формат zip ув індексі має спеціяльний біт, назвемо його uses_unicode, який == 1, якщо ім'я файлу закодовано ув utf8; якщо біт == 0, тоді мається на увазі кодування IBM Code Page 437 (так).
Хтось на Маку зробив .zip, де закодував імена файлів ув utf8, але біт uses_unicode не виставив:

Лайнаксові unzip(1) та file-roller такий варіянт розпізнають, але 10й віндюка--ні. Він чесно намагається, згідно зіповського спеку, деінкодити cp437.
Суто для лулзів, я створив файл 'толстоевский.txt' та запхнув його до 1.zip за допомогою віндюкового іксплорера (Send To → Compressed zip folder). Останній зробив хід конякою: заінкодив ім'я файлу ув cp866 (так), а біт uses_unicode не виставив.
Федорівський unzip зрозумів що коїться, але гноумівський file-roller ні, і марно намагався перекодувати cp437 до юнікодної локалі.
Загалом, найліпше себе поводить zip(1) на лайнаксі: інкодить ув utf8 та виставляє uses_unicode біт.
7-zip під віндюка робить дещо інше: uses_unicode == 0, ім'я файлу ув cp866, але додатково записує те саме ім'я файлу ув utf8 до опціонального extra field ув індексі з id 0x7075, що називається Info-ZIP Unicode Path.
Оригінальний файл--квінтесенція СНД:
__MACOSX/Рецензия смет докум/._~$сьмоdoc.doc
Рецензия смет докум/247_ДЦ_ДЦ_3.rtf