初めて質問させて頂きます。
現在やろうとしていることは、ZIPファイルをweb上でアップロードして解凍する機能を作っています。
そこでzipArchiveクラスを使おうと考えたのですが、linuxで圧縮したzipファイルは問題ないのですが、windowsで圧縮したzipファイルだと日本語部分が文字化けしてしまいます。
エンコーディングをUTF-8に変更したり、linux側のlocaleも変更したのですが、それでも日本語部分の文字化けが直りませんでした。
windowsで圧縮されたzipファイルの日本語部分を文字化けすることなく解凍するための方法を教えて頂きたく質問しました。
コードを載せますので、ぜひご教授ください。
public function extractionZip($data = null, $destDir = TMP, $toEncoding = 'UTF-8') { if (setlocale(LC_ALL, 'ja_JP.UTF-8') === false) { error_log('Locale not found: ja_JP.UTF-8'); exit(); } $zip = new ZipArchive; $zipFile = TMP . 'zip/' . $data['Zip']['name']; $hex = file_get_contents($zipFile, false, null, 7, 1); $fromEncoding = (ord($hex) & 0x08) === 0x08 ? 'UTF-8' : 'CP932'; $sameEncoding = $fromEncoding === $toEncoding; $res = $zip->open($zipFile); if ($res === false){ return false; exit(); } $num_files = $zip->numFiles; for ($i = 0; $i < $num_files; $i++) { $stat = $zip->statIndex($i); $name = $sameEncoding ? $stat['name']: mb_convert_encoding($stat['name'], $toEncoding, $fromEncoding); if ($name[strlen($name)-1] === '/') { continue; } $splited = explode('/', $name); $baseName = array_pop($splited); $dir = empty($splited) ? $destDir. implode('/', $splited). '/' : $destDir ; if (is_dir($dir) === false) { mkdir($dir, 0777, true); } file_put_contents("{$dir}{$baseName}", $zip->getFromIndex($i), LOCK_EX); } $dir = $zip->extractTo(TMP . 'zip'); $zip->close(); }
ご回答を参考にして書いたコードです。解凍はするのですが、ディレクトリ名が日本語だと文字化けし、圧縮したファイル名が日本語だとそれも文字化けします。英語やlinuxで圧縮したファイルであれば問題ありません。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/14 09:18
退会済みユーザー
2015/10/14 09:54
2015/10/14 10:04
退会済みユーザー
2015/10/14 10:19
2015/10/15 03:26
退会済みユーザー
2015/10/16 05:09
2015/10/16 09:01
退会済みユーザー
2015/10/16 09:05