3

Zipフォルダー内のファイル名は「Norgespråk.pdf」です。zipフォルダーを解凍すると、ファイル名が「Norgespr†k.pdf」になります。

zip = new ZipArchive;
if ($zip->open($path, ZIPARCHIVE::CREATE) === true) 
{
    if(!file_exists(WWW_ROOT."/excel/".$name))
    {
        mkdir(WWW_ROOT."/excel/".$name, 0777);
    }
    for($i = 0; $i < $zip->numFiles; $i++) 
    {
        $fileinfo = pathinfo($zip->getNameIndex($i, ZIPARCHIVE::FL_UNCHANGED));

        copy("zip://".$path."#".htmlentities($test, ENT_COMPAT, 'ISO-8859-1'), WWW_ROOT."/excel/".$name.'/'.htmlentities($fileinfo['basename'], ENT_COMPAT, 'ISO-8859-1'));
    }                   
    $zip->close();                   
}

誰でもこの問題について私を助けてください。

4

1 に答える 1

2

Cake PHPについてはわかりませんが、本当の問題はZIPにあります。問題は、zip形式のファイルのデータがバイナリデータとして扱われないことです。これは、独自のファイル/変数の処理に根ざしている可能性があります。phpはルーズタイプです。つまり、変数のタイプはphpエンジンによって自動的に選択されます。

もう1つは、ファイル名の処理です。これらの名前は文字データであり、そのようにzipファイルに保存され、エンコーディングに関する情報はありません。

したがって、確実に使用できるのは7ビットASCIIだけです。しかし、ISO-Latin-1コードテーブルは広く使用されているため(そしてすべてのスカンジナビアの特殊文字が含まれているため)、自分のコンピューターで入力したファイル名が原因ではないため、直面する問題は自動変換によっても引き起こされる傾向があります再びそこに表示されたときの違い。

回避するために提供されているソリューション:

 $zip->addFile($file_data['path'], iconv("UTF-8","CP852",$file_name));

キャラクター(他のエンコーディング)またはエンコーディングとしてCP852を使用するか、

 system('unzip -o ' . $file);

実際の問題を表示するには、phpzipコンテンツエンコーディングをお読みください。

于 2013-03-05T09:33:10.600 に答える