正确解码zip条目文件名称

我最近编写了一个名为zipzap的zip文件I / O库,但我正努力从任意zip文件正确解码zip条目文件名。

现在,PKWARE规范指出:

D.1 ZIP格式历来只支持原始的IBM PC字符编码集,通常称为IBM Code Page 437 ......

D.2如果未设置通用第11位,则文件名和注释应符合原始ZIP字符编码。 如果设置了通用第11位,则文件名和注释必须使用UTF-8存储规范定义的字符编码格式支持Unicode标准,版本4.1.0或更高版本...

这意味着符合zip文件将文件名称编码为CP437,除非设置了EFS位,在这种情况下,文件名是UTF-8。

不幸的是,很多zip工具似乎没有正确设置EFS位(例如Mac CLI,GUI zip)或使用其他编码,通常是默认系统(例如WinZip?)。 如果您知道WinZip,7-Zip,Info-Zip,PKZIP,Java JAR / Zip,.NET zip,dotnetzip等编码文件名以及他们将其“版本设置”字段设置为压缩时的情况,请告诉我。

特别是,Info-Zip在解压缩时会尝试这样做:

  • 文件系统= MS-DOS(0)=> CP437
  • 除了:版本= 2.5,2.6,4.0 => ISO 8859-1
  • 文件系统= HPFS(6)=> CP437
  • 文件系统= NTFS(10)和版本= 5.0 => CP437
  • 否则,ISO 8859-1
  • 如果我想支持检查或从任意zip文件中提取,并且在没有EFS标志的情况下合理地尝试文件名编码 ,我可以寻找什么?


    确定文件名是否使用UTF-8编码而不使用EFS标志的唯一方法是检查是否在其中一个字符中设置了高位。 这可能意味着该字符是UTF-8编码的。 然而,它仍然可能是另一种方式,因为CP437中有一些字符的高位被设置,并且不能被解码为UTF-8。

    我会坚持使用PKWARE应用笔记规范,而不是试图解决现有每个已知的zip应用的解决方案。


    目前情况如下:

  • 大多数Windows实现使用DOS(OEM)编码
  • Mac OS zip实用程序使用utf-8,但它不设置utf-8位标志
  • * nix zip实用程序默默使用系统编码
  • 所以唯一的方法是检查文件名是否包含类似utf-8字符的内容(查看utf8编码的描述 - 第一个字节应该是110xxxxx,其次是10xxxxxx,用于2字节编码字符)。 如果它是正确的utf8字符串 - 使用utf8编码。 如果不是 - 回退到OEM / DOS编码。

    链接地址: http://www.djcxy.com/p/65725.html

    上一篇: Correctly decoding zip entry file names

    下一篇: To add new value in every element in list in R?