3

phpスクリプトを使用して、UTF-8エンコーディングでいくつかの.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();
4

2 に答える 2

0

これは、PHPでUTF-8でエンコードされたファイル名を処理できないという未解決のバグのようです。

これについても同様の質問があります。

PHP+Apacheで特殊文字を含むファイルを圧縮する際の問題-エンコーディングの問題

于 2012-11-07T19:22:51.467 に答える
0

また、UTF8 文字を使用した ZIP アーカイブの抽出の問題にも遭遇しました。この問題に対する実際の解決策を見つけることができませんでした (5.6 で作業しているため、PECL の問題はまだ存在していると思います) 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 に答える