这个问题原因是Ios版本的ZipArchive工程中,编码格式变为UTF-8.然后windows上的编码格式多数是GBK。
那么打开ZipArchive的源码,改变编码方式就行了。
找到函数:
-( BOOL ) addFileToZip:( NSString *) file newname:( NSString *) newname
{
if ( [ _password length ] == 0 )
{
zipOpenNewFileInZip ( _zipFile ,
( const char *) [newname UTF8String ],// UTF-8方式编码
&zipInfo,
NULL , 0 ,
NULL , 0 ,
NULL , //comment
Z_DEFLATED ,
Z_DEFAULT_COMPRESSION );
}
}
将上述代码中划线部分,替换为下面部分即可。
( const char *) [newname cStringUsingEncoding :CFStringConvertEncodingToNSStringEncoding (kCFStringEncodingGB_18030_2000 )]
原因是:ZipArchive类的解压函数 -(BOOL) UnzipFileTo:(NSString*) path overWrite:(BOOL) overwrite
在遍历压缩文件包,获取包文件的名字处理上存在Bug.
1. 下面两行代码获取包中当前文件的文件名
unzGetCurrentFileInfo(_unzFile, &fileInfo, filename, fileInfo.size_filename + 1, NULL, 0, NULL, 0);
filename[fileInfo.size_filename] = '\0'; //未尾追加0 结束
此时获取的文件名是正确的.
2. 但是由char*获取得到NSString*的转换方法使用出错,Mac默认是按UTF8编码的
//NSString * strPath = [NSString stringWithCString:filename]; //此处得到的 strPath为空,导致函数返回YES,但目录下无文件
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString * strPath = [NSString stringWithCString:filename encoding:enc]; //正确! 这个地方应该是跟压缩时的编码对应上才对。