正确解码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在解压缩时会尝试这样做:
如果我想支持检查或从任意zip文件中提取,并且在没有EFS标志的情况下合理地尝试文件名编码 ,我可以寻找什么?
确定文件名是否使用UTF-8编码而不使用EFS标志的唯一方法是检查是否在其中一个字符中设置了高位。 这可能意味着该字符是UTF-8编码的。 然而,它仍然可能是另一种方式,因为CP437中有一些字符的高位被设置,并且不能被解码为UTF-8。
我会坚持使用PKWARE应用笔记规范,而不是试图解决现有每个已知的zip应用的解决方案。
目前情况如下:
所以唯一的方法是检查文件名是否包含类似utf-8字符的内容(查看utf8编码的描述 - 第一个字节应该是110xxxxx,其次是10xxxxxx,用于2字节编码字符)。 如果它是正确的utf8字符串 - 使用utf8编码。 如果不是 - 回退到OEM / DOS编码。
链接地址: http://www.djcxy.com/p/65725.html