从其它平台迁移而来
Lazarus压缩/解压zip文件可以使用Zipper单元中的TZipper/TUnZipper类来实现,但是在有中文文件名时需要注意,否则会出现乱码。
压缩
TZipper的Zip类方法无需创建实例即可直接生成zip压缩文件。
TZipper实例的ZipFile方法是压缩一个指定的文件生成zip压缩文件,ZipFiles方法是压缩多个指定的文件生成zip压缩文件,UnZipAllFiles方法是配合Entries等属性生成zip压缩文件。
解压
TUnZipper的UnZip类方法无需创建实例即可直接解压zip文件。
TUnZipper实例的UnZipFile方法是解压出一个指定的文件,UnZipFiles方法是解压出多个指定的文件,UnZipAllFiles方法可以从zip文件中解压出所有文件。
乱码
无中文文件名的情况下,以上类方法和实例方法使用都是正常的,与其它压缩/解压工具交叉使用也不会出现问题。
当存在中文文件名时,成对使用以上压缩/解压方法,从结果上来说是没什么问题的,但与其它压缩/解压工具交叉使用时就会出现文件名乱码问题。
乱码其实还是字符编码的问题,Lazarus默认使用UTF8编码,windows默认使用OEM对应的编码,对于中文windows就是GBK编码,于是就出问题了。
解决方案
TZipper有UseLanguageEncoding属性,TUnZipper有UseUTF8属性,均设置为True,再进行压缩/解压即可,因此,类方法是肯定不行的了。
不过,这两个属性在语意上却十分让人费解,因为属性为False时,zip文件头里的文件名实际使用的是UTF8编码,而当属性为True时,zip文件头里的文件名实际使用的却是GBK编码,搞不懂这些老外的想法。
对了,好像要使用FPC 3.2.0+的编译器版本才可以。