【问题标题】:php zip contents encodingphp zip 内容编码
【发布时间】:2023-03-09 12:20:02
【问题描述】:

我通过 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();

【问题讨论】:

  • 首先,iconv("UTF-8","UTF-8", str) 什么都不做(例如,返回 str),除了如果 str 包含无效的 UTF-8 序列,则返回一个空字符串。您对 ZIP 文件中的文件名或文件内容有疑问吗?
  • 您面临什么样的问题? PHP代码抛出错误? ZIP 无法解压?
  • 问题是我创建的压缩文件改变了压缩文件内容的编码。

标签: php encoding zip


【解决方案1】:

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

关于这个也有类似的问题。

Problem when zipping files with special characters in PHP+Apache - encoding issue

【讨论】:

    【解决方案2】:

    我还遇到了使用 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2011-03-11
      相关资源
      最近更新 更多