PHP压缩文件内容编码

3

我将通过一个使用UTF-8编码的php脚本创建一些.txt文件(带有希腊字符)。当我尝试从ftp下载并阅读这些文件时,一切都很顺利(没有编码问题)。

但是,当我将这些文件压缩到zip归档文件中时,我遇到了所有希腊字符和新行字符的编码问题。

zip脚本:

    $zip = new ZipArchive();
    $filename = "my_zip.zip";

    if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
        exit("cannot open <$filename>\n");
    }


    $files = glob('users/'.$_SESSION['s_uid'].'/*'); // get all file names
    foreach($files as $file){ // iterate files
        if(is_file($file))
            //$zip->addFile($thisdir . $file, basename($file));
            $zip->addFile($thisdir . $file, iconv("UTF-8","UTF-8", basename($file)));
            //echo $file; // delete file
    }   
    $zip->close();

首先,iconv("UTF-8","UTF-8", str) 没有任何作用(例如返回 str),除非 str 包含无效的 UTF-8 序列,此时会返回空字符串。您是在 ZIP 文件中遇到文件名问题还是文件内容问题? - dnet
你遇到了什么问题?PHP代码报错了吗?ZIP无法解压缩? - Passerby
问题在于我创建的压缩文件会改变被压缩文件内容的编码。 - kokazani
2个回答

0

我也遇到了使用UTF8字符解压ZIP归档文件的问题。我一直没有找到任何真正的解决方案(我认为PECL中的问题仍然存在,因为我正在使用5.6)https://bugs.php.net/bug.php?id=53948

...所以我想出了一个解决方法,它涉及在提取归档文件之前重命名归档文件。通过这种解决方法,我仍然可以允许用户上传其归档中的UTF8文件名,但我只是用正则表达式替换特殊字符。

            $zip = new ZipArchive;
            if ($zip->open($file_path) === true) {
                for ($i = 0; $i < $zip->numFiles; $i++) {
                    $fname = $zip->getNameIndex($i);      
                    $fname_new = // your str replacemenet code...
                    $zip->renameIndex($i, $fname_new);

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接