正确解码的ZIP条目的文件名 - CP437,UTF-8或?(Correctly decoding

2019-07-03 14:42发布

我最近写了一个zip文件名为I / O库zipzap ,但我从任意zip文件正确解码压缩项的文件名中挣扎。

现在, PKWARE规格规定:

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

D.2如果通用11位没有设置,文件名和评论应符合原ZIP字符编码。 如果通用11位被设置,文件名和注释必须支持Unicode标准,版本4.1.0或使用由UTF-8存储规范中定义的字符编码形式更大...

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

不幸的是,似乎很多的压缩工具,要么不正确设置EFS位(如Mac的CLI,GUI ZIP)或使用其他的编码,通常默认的系统之一(例如WinZip的?)。 如果你知道怎样的WinZip,7-ZIP,信息-ZIP,PKZIP,Java的JAR / ZIP,ZIP .NET,dotnetzip等编码文件名和他们设置字段的“由国产版” 拉拉链时,请告诉我。

具体而言,信息-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标志的文件名编码一个合理的尝试 ,我可以看看?

Answer 1:

只有这样,才能确定该文件名被编码为UTF-8,而无需使用EFS标志进行检查,看是否高阶位在字符中的一个设置。 这可能意味着可能的字符是UTF-8编码。 但是,它仍然可能是另一种方式,因为在CP437一些字符具有高阶位,并且不意味着被解码为UTF-8。

我会坚持到PKWARE应用笔记说明书及努力保持一致存在所有已知的拉链应用的解决方案没本事。



Answer 2:

目前的情况是如下:

  • 大多数Windows实现使用DOS(OEM)的编码
  • 的Mac OS压缩实用程序使用UTF-8,但它不设置UTF-8位标志
  • * nix的压缩实用程序默默地使用系统编码

因此,唯一的方法是检查是否文件名包含有类似的UTF8字符(检查UTF8编码的描述 - 第一个字节应该是110xxxxx,第二 - 10xxxxxx为2个字节的编码的字符)。 如果它是正确的UTF8字符串 - 使用UTF8编码。 如果没有 - 回落到OEM / DOS编码。



文章来源: Correctly decoding zip entry file names — CP437, UTF-8 or?