質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

1016閲覧

サーバ上のファイルをZipダウンロードした際に日本語ファイル名が文字化けする

miiisya

総合スコア35

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/04/04 05:05

編集2022/04/04 05:44

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaz.Suenaga

2022/04/04 08:16

圧縮対象はディレクトリに見えますが、ディレクトリが日本語名称なだけでしょうか。それともそのディレクトリ内のファイルも日本語名でしょうか。 Linuxサーバー上のパスがUTF-8で作成されており、Windowsの標準Zip展開ツールはそれをShift-JIS(CP932)のつもりで展開することでファイル名が文字化けするので、zip 作成時の対象ファイル名自体をCP932 でエンコードしたものにする必要があるかと思います。 上記のリファレンスを見ると read_dir ではそれができなそうなので、 read_file と add_dir で構造を再現しつつ zip を作る必要がありそうに見えます。 (もしくは作業ファイルとしてCP932で命名したファイル群を作る)
miiisya

2022/04/04 08:35

ディレクトリは日本語ではなく、ディレクトリの中のファイルの一部が日本語名となっています。 read_dirで一括で取得してくるのではなく、ディレクトリを回しながら構造を再現しつつ、必要なところで ファイル名をエンコードする感じでしょうか? >もしくは作業ファイルとしてCP932で命名したファイル群を作る すみませんがイメージができないのですが、どういったことでしょうか? 余裕がありましたら教えていただきたいです。
guest

回答2

0

質問への 2022/04/04 17:35 の回答を受けてです。

ファイル名をエンコードする感じでしょうか?

試していないのでわからないのですが、リファレンスから想像するとそういうことです。

read_file([圧縮対象のファイル], [zipに含めるファイル名]) という使い方ができそうですので、

PHP

1$path = '/path/to/data/日本語ファイル名.dat`; 2// Shift-JIS化したファイル名パス 3$sjisPath = '/data/' . mb_convert_encoding( basename($path), 'CP932', 'UTF-8'); 4$this->zip->read_file($path, $sjisPath);

といった処理を add_dir() を使って階層を再現しつつ設定していくことで解決できるのではないでしょうか。

もしくは作業ファイルとしてCP932で命名したファイル群を作る

すみませんがイメージができないのですが、どういったことでしょうか?

これは上記処理を一旦例えば、 /tmp/data/sjis化した日本語ファイル名.dat といった作業ディレクトリにファイルをコピーすることで準備し、 $this->zip->read_dir('/tmp/data, False);` とその作業ディレクトリを圧縮することで実行する、という手順で実現してもよい、ということなので、やってることは同じで、サーバー上でUTF-8で命名されているパスをShift-JIS化して zip を作成する、ということでした。

投稿2022/04/04 08:52

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miiisya

2022/04/04 09:00

回答いただきありがとうございます。 試してみますので、明日また報告させていただきます。
guest

0

Windows標準のzip対応はUTF-8のファイル名に対応していません。
7zipなどUTF-8に対応したソフトウェアで展開してください。

投稿2022/04/04 05:38

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miiisya

2022/04/04 05:43

回答いただきありがとうございます。 7zip、ラプラスで解凍してみましたが文字化けが起きたままのため、質問させていただきました。 質問を編集しておきます。
Y.H.

2022/04/04 07:13

LhaplusはUTF-8対応していません。 Linuxサーバ では文字化けしないのでしょうか?
miiisya

2022/04/04 07:15

>Linuxサーバ では文字化けしないのでしょうか? リナックスサーバー上においてあるファイル名が文字化けしていないか?ということでしょうか? 認識違ったらすみませんが、そちらは文字化けしていないです
Y.H.

2022/04/04 07:21

ダウンロードしたData.zipを解凍したら解凍したファイル/ディレクトリ名が文字化けしているのではないのでしょうか? Linuxサーバ でData.zipをunzipコマンドで解凍しても文字化けするのでしょうか?
miiisya

2022/04/04 08:02

>ダウンロードしたData.zipを解凍したら解凍したファイル/ディレクトリ名が文字化けしているのではないのでしょうか? その通りです。 >Linuxサーバ でData.zipをunzipコマンドで解凍しても文字化けするのでしょうか? 文字化けしませんでした。 パスを自身のデスクトップ(Windows)に指定して、Windows環境で解凍しても文字化けしないため エンコード処理がうまくできていないのだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問