我最近编写了一个名为zipzap的 zip 文件 I/O 库,但我正在努力从任意 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、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 标志的情况下对文件名编码进行合理尝试,我可以寻找什么?