Linuxサーバに配置してあるフォルダをzip圧縮し、ダウンロードする処理の中で日本語ファイル名が文字化けしてしまいます。
コードは下記のような感じで、CodeIgniterというフレームワークのZip 圧縮クラスを用いて実装しています。
解凍側はWindowsとなっており、7zip、ラプラスで解凍しても文字化けが直らない状態です。
php
1 2class ZipDownload extends CI_Controller{ 3 4 public function __construct() 5 { 6 parent::__construct(); 7 $this->load->library('zip'); 8 } 9 10 11 public function index() 12 { 13 $path = 'ダウンロード対象のサーバパス'; 14 //ファイル名が文字化けしているためひとまず文字コード変換を入れているが効いていない模様 15 $data = mb_convert_encoding($path,'UTF-8''CP932',); 16 //サーバ上のファイルを圧縮 17 $this->zip->read_dir($data,FALSE); 18 //圧縮したものをダウンロード 19 $this->zip->download('Data.zip'); 20 //Data.zip解凍後、解凍ファイルの中の日本語ファイル名が文字化けしている 21 } 22}
圧縮対象はディレクトリに見えますが、ディレクトリが日本語名称なだけでしょうか。それともそのディレクトリ内のファイルも日本語名でしょうか。
Linuxサーバー上のパスがUTF-8で作成されており、Windowsの標準Zip展開ツールはそれをShift-JIS(CP932)のつもりで展開することでファイル名が文字化けするので、zip 作成時の対象ファイル名自体をCP932 でエンコードしたものにする必要があるかと思います。
上記のリファレンスを見ると read_dir ではそれができなそうなので、 read_file と add_dir で構造を再現しつつ zip を作る必要がありそうに見えます。
(もしくは作業ファイルとしてCP932で命名したファイル群を作る)
ディレクトリは日本語ではなく、ディレクトリの中のファイルの一部が日本語名となっています。
read_dirで一括で取得してくるのではなく、ディレクトリを回しながら構造を再現しつつ、必要なところで
ファイル名をエンコードする感じでしょうか?
>もしくは作業ファイルとしてCP932で命名したファイル群を作る
すみませんがイメージができないのですが、どういったことでしょうか?
余裕がありましたら教えていただきたいです。
