Правильно декодировать имена файлов zip - файлов-CP437, UTF-8 или?

недавно я написал zip - файл библиотеки ввода-вывода под названием zipzap, но я борюсь с правильным декодированием имен файлов zip-файлов из произвольных zip-файлов.

и pkware по адресу спецификаций гласит:

D. 1 формат ZIP исторически поддерживал только исходный символ IBM PC набор кодировок, обычно называемый IBM Code Page 437...

D. 2 если бит общего назначения 11 не установлен, имя файла и комментарий должен соответствовать к оригинальной кодировке символов ZIP. Если установлен бит 11 общего назначения, то имя файла и комментарий должны поддерживать стандарт Unicode версии 4.1.0 или больше, используя форму кодировки символов, определенную хранилищем UTF-8 спецификация...

Что означает, что соответствующие zip-файлы кодируют имена файлов как CP437, если бит EFS не установлен, и в этом случае имена файлов UTF-8.

к сожалению, кажется, что много zip-инструментов либо не устанавливайте бит EFS правильно (например, MAC CLI, GUI zip) или используйте другую кодировку, обычно системную (например, WinZip?). Если вы знаете, как архиватор WinZip, 7-Zip, то информация-зип-обычные zip, jar-файла Java/зип .Чистая молния, dotnetzip и т. д. кодируйте имена файлов и то, что они устанавливают в поле "версия, сделанная", когда сжать, пожалуйста, скажите мне.

в частности, Info-Zip пытается это, когда разархивирование:

  • файловая система = MS-DOS (0) => CP437
    • кроме: version = 2.5, 2.6, 4.0 = > ISO 8859-1
  • файловая система = HPFS (6) => CP437
  • файловая система = NTFS (10) и версия = 5.0 => CP437
  • в противном случае, ISO 8859-1

если я хочу поддержать проверку или извлечение из произвольных zip-файлов и сделать разумный попытка кодирования имени файла без флага EFS, что я могу искать?

2 ответов


единственный способ определить, закодировано ли имя файла как UTF-8 без использования флага EFS, - это проверить, установлен ли бит высокого порядка в одном из символов. Что может возможно означает, что символ кодируется UTF-8. Однако это все равно может быть наоборот, поскольку в CP437 есть некоторые символы, которые имеют бит высокого порядка и не предназначены для декодирования как UTF-8.

Я бы придерживался спецификации pkware app note и не взламывал решение, которое пытается соответствовать каждому известному приложению zip в существовании.


на данный момент ситуация выглядит следующим образом:

  • большинство реализаций Windows используют кодировку DOS (OEM)
  • утилита Mac OS zip использует utf-8, но не устанавливает флаги utf-8 бит
  • *Nix zip utilities молча использует системную кодировку

таким образом, единственный способ-проверить, содержит ли имя файла что-то вроде utf-8 символов (проверьте описание кодировки utf8 - первый байт должен быть 110xxxxx, второй-10xxxxxx для 2-байтов пеструшки.) Если это правильная строка utf8-используйте кодировку utf8. Если нет-вернитесь к кодировке OEM/DOS.