我最近写了一个名为zipzap的zip文件输入输出库,但我正在努力从任意的zip文件中正确解码zip入口文件名。
现在,PKWARE规范指出:
D.1 ZIP格式历史上只支持原始IBM-PC字符编码集,通常称为IBM代码页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标志的情况下尝试进行文件名编码的合理处理,我应该寻找什么?