ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Let's PHPコミュのheaderでファイル名を指定する時の文字コードについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
行き詰ってしまい、困っています。

データベースにファイル名(日本語を含みます)を登録し、ファイルを番号で保存するシステムを作っています。ファイル読み込みの際、

 file.php?id=??

として呼び出すと、データベースから対応するファイル名をとって来て、

 $file = "/home/files/{$id}";
 $mime = mime_content_type($file);
 
 header("Content-type: {$mime}");
 header("Content-Disposition: inline; filename={$name}");
 readfile($file);

と、いう具合にファイルを出力するスクリプトです。
ここで、データベースはEUC-JPなのですが、$nameはmb_combert_encodingでOSやブラウザ別に文字コードを変更して出力しています。

 Win + IE = SJIS
 Mac OS X + IE = SJIS
 上記以外 = UTF-8
 
しかし、Mac + Safariでは「SJIS」「JIS」「EUC-JP」「UTF-8」のうちいずれを試しても文字化けしてしまいました。
もし、何か良い方法をご存知の方がおられましたら、教えていただけないでしょうか。

ちなみに、サーバーは下記です。
Fedora Core 3 / PHP 4.3.11

コメント(9)

> きむらしのぶ さん

はじめまして。

質問の内容ですが、仕様上は正しい動作をしています。

参考:
http://www.asahi-net.or.jp/~bd9y-ktu/dtd_f/rfc_f/rfc2183j.html
「最新の[RFC 2045]文法は、パラメーター値(そしてそれ故にContent-Dispositionファイル名)をUS-ASCIIに限定しています。」

上記のとおり、仕様ではUS-ASCIIに限定されているようです。
> ほーねっとさん
回答ありがとうございます。
リンク先を見させてもらいました。

うまく日本語ファイル名でダウンロードできたブラウザが親切なだけで、Safariは仕様通り作ってあるということと理解しました。
ユーザーのうち数人がSafariを使っているので、代替案を考えてみます。
$nameをmime encodingしてあげないといけないのでは?

$name = mb_convert_encoding($name, "ISO-2022-JP", "EUC-JP");
$name = base64_encode($name);
$name = "=?iso-2022-jp?B?".$name."?=";

家にかえるまでSafariがないから試せないけど…
あとheaderでcontent-lengthも吐いてあげないと…

$filesize = filesize($file);
header("Content-Length: " . $filesize);
header("Content-type: application/octet-stream; name=" . $filename);
header("Content-disposition: inline; filename=" . $filename);

こんなかんじでマルチバイトのファイル名の指定が出来ています@safari on MacOSX 10.4.2
safariの場合、ファイル名のエンコーディングはEUCでないといけませんが、
Windows + IEの場合ではSJISにしないとダメっす(確か)。
う〜ん、1番の回答でほーねっとさんがおっしゃっているように
RFC的にはこのfilename属性に日本語(マルチバイト)を
入れることは正しくありません。

正しいmime形式で記述してあげれば、どのブラウザでも
表示されると思います。
補足ですが、mime encodeすれば、当然ブラウザ毎に
ファイル名のエンコーディングを変える必要もありません。
そうなんですよねえ。
「とりあえず動く」実装の1例として…。

手が空かないのでmimeの方は試していません。

# 大した手間じゃないんですが

誰か実験されている方がいらしたらヘルプー。
> 尾崎さん
回答ありがとうございます。早速提示いただいたコードを試してみたのですが、やはりSafariでは失敗します。症状は、「=?iso-2022-jp?B?xxxxxxx?=」とエンコードしたままの文字列がファイル名になってダウンロードしてました。
日本語をファイル名に使うのは良くないと十分理解しているのですが、使う側の人間に僕の思いを伝える事ができず...作くることになりました。最近は多くの言語に対応してきていることから、僕もこんなに苦労すると思わず、「やってみますね」などと答えたのが、間違いでした。

> keyさん
コードの提示ありがとうございます。しかし、当方のSafariでは、やっぱりうまくいきませんでした。OSが10.4とのことですが、こちらには10.3しかなく、バージョンの違いによるものかなとも思いますが、せっかく教えてもらったのに、申し訳ありません。

今日は家に帰ってしまいましたので、明日またリベンジしてみます。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Let's PHP 更新情報

Let's PHPのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング