zip 中文文件夹为空问题

时间:2021-10-31 13:14:46

这个问题原因是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]; //正确! 这个地方应该是跟压缩时的编码对应上才对。