プロが教えるわが家の防犯対策術!

Perlで、ヘッダーを付けてファイルをダウンロードするスクリプトを作っています。
以下のように、test.html(EUC)からattach.cgi(Shift-JIS)へ飛びますが、IEとFirefoxで動作が違います。

・IE: ファイル名が化けない
・Firefix : ファイル名が化ける

おそらく、Firefoxの場合、呼び出し元がEUCなので、その先のattach.cgiもEUCだと決め付けているのでしょう。
試しに、attach.cgiをEUCにした場合、動作が逆になります。

・IE: ファイル名が化ける
・Firefix : ファイル名が化けない

ブラウザに対して、「ファイル名はShit-JISです」と宣言できるような文があればと思って調べているのですが、見つかりません。
ファイル名が化けないようにする方法がありましたらご教授いただけますと助かります。


■==== test.html (EUC) =======
<HTML>
<HEAD><meta http-equiv="Content-Type" content="text/html;charset=EUC-JP"></HEAD>
<BODY>
<a href="attach.cgi">添付ファイルのテスト</a>
</BODY>
</HTML>


■==== attach.cgi (Shift-JIS) =======
$filename="日本語のテストです.txt";
print "Content-type: application\n";
print "Content-Disposition: attachment; filename=$filename\n\n";



■テストした環境
IE 6.0
Firefox 2.0.0.8
WindowsXP(sp2)
Perl 5.8.8


よろしくお願いします。

A 回答 (2件)

IEの挙動がおかしいんですけどね。


http://web.sfc.keio.ac.jp/~t03920hm/diary/index. …

USER_AGENTを取得し、そこで分岐させる方法がスタンダードです。
当方はPerlから離れて久しいのでどう取るかは失念しましたが・・・
他の方に期待。(調べた方が早そうですが^^;)



>では、attach.cgiの
(snip)
>print "Content-type: application; charset=Shift_JIS\n";
>というふうにContent-typeにも文字コードを指定してあげるようにしてはいかがでしょう?
出力されるファイルの文字コードを変えても解決しませんよ。

>print "Content-type: application\n";
>とありますが改行という意味の\nは二回つける方が多く見かけます。
すべてのコードには意味があります。
意味が分からないうちになんとなく使うのは危険だということを認識しましょう。

HTTPの仕様は「最初の空行まではヘッダ」となってます。
// 少し違いますが
Perlの場合はヘッダを明示的に書かねばならないので空行(\n\n)を書くのです。
    • good
    • 0
この回答へのお礼

やはりIEがおかしいのですね。
USER_AGENTで分岐させるようにして回避することにします。
やりかたは知っています。

linuxやMacでのテスト環境がないため、少し不安ですが、今の環境は、Windows以外のVisitがありえ無いクローズな環境なので、これでいきます。

ありがとうございました。

お礼日時:2007/11/29 13:27

では、attach.cgiの



print "Content-type: application\n";

とありますContent-typeをいじって

print "Content-type: application; charset=Shift_JIS\n";

というふうにContent-typeにも文字コードを指定してあげるようにしてはいかがでしょう?

それから一つ気になったのが
print "Content-type: application\n";
とありますが改行という意味の\nは二回つける方が多く見かけます。
もしあれでしたら最終的には

print "Content-type: application; charset=Shift_JIS\n\n";

というふうに文字コードにプラスしてもう一つ\nをつけてみて下さい。
それは文字バケの解決には関係ないでしょうけど。。

この回答への補足

回答ありがとうございます。

ブラウザのキャッシュをクリアした後、attach.cgiにcharset=Shift_JISを試してみました。
情況変わらず、Firefoxではファイル名が文字化けします。

■変更前
print "Content-type: application;\n";
■変更後
print "Content-type: application; charset=Shift_JIS\n";


あと、改行の余分な\nは、ここでヘッダーが終わりですよ、という意味だと思っていました。
ヘッダーの1行目で\n\nとしてしまうと、2行目のContent-Dispositionが本文として扱われるのではないでしょうか?

補足日時:2007/11/29 13:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!