相关疑难解决方法(0)

正确解码zip条目文件名 - CP437,UTF-8或?

我最近写了一个名为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标志的情况下合理地尝试文件名编码,我还能找到什么?

zip jar 7zip zipfile winzip

10
推荐指数
2
解决办法
6731
查看次数

标签 统计

7zip ×1

jar ×1

winzip ×1

zip ×1

zipfile ×1