3

我通过 UTF-8 编码的 php 脚本创建了一些 .txt 文件(带有希腊字符)。当我尝试从 ftp 下载和读取这些文件时,一切正常(没有编码问题)。

当我将这些文件压缩到 zip 存档时,我面临所有希腊字符和 newLines 字符的编码问题。

压缩脚本:

    $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();
4

2 回答 2

0

这似乎是 PHP 无法处理 UTF-8 编码文件名的一个未解决的错误。

对此也有类似的问题。

在 PHP+Apache 中压缩带有特殊字符的文件时出现问题 - 编码问题

于 2012-11-07T19:22:51.467 回答
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);
于 2016-09-30T11:49:49.463 回答