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
よろしくお願いします。
No.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)を書くのです。
やはりIEがおかしいのですね。
USER_AGENTで分岐させるようにして回避することにします。
やりかたは知っています。
linuxやMacでのテスト環境がないため、少し不安ですが、今の環境は、Windows以外のVisitがありえ無いクローズな環境なので、これでいきます。
ありがとうございました。
No.1
- 回答日時:
では、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が本文として扱われるのではないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/02 11:48
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/07/01 12:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CGI実行できない。ソースが表示...
-
cgiからsendmailを送信で文字化け
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
SUN BBSの改造方法
-
pythonのnumpyでの列(縦)ベク...
-
vsftpd+sslでアップロードできない
-
HTML プルダウンメニューの選択...
-
Javascriptの変数をCGIに送る方法
-
perlで書いたcgiでsqliteの使い...
-
Webアプリケーションを作りたい!
-
WEBページを強制的に横画面で見...
-
『数字の3桁毎にカンマを付け...
-
HTMLからCGIへデータを引き継ぎ
-
チェックボックスで選択した内...
-
標準入力からデータが読込めない
-
VBで表示したホームページの...
-
open.window(javascript) を使...
-
CGI
-
htmlからパラメータで、cgiに渡...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UTF-8で文字化けしないようにす...
-
cgiからsendmailを送信で文字化け
-
perlを難読化、暗号化させたい
-
プログラミングについての質問...
-
cgiで動画ファイルをアップロー...
-
WEBアプリケーションからフォル...
-
CGI実行できない。ソースが表示...
-
content-dispositionによるファ...
-
CGI管理ページなどより背景画像...
-
wordの数式について 定積分を書...
-
ラジオボタンが両方とも選択で...
-
select値をhiddenのvalueに渡し...
-
「value」に2つの値をセットす...
-
チェックボックスの返す値
-
INPUT TYPE
-
WEBページを強制的に横画面で見...
-
[HTML]プルダウンメニューの横...
-
VB.net データーグリッドビュー...
-
別formのhidden項目を自form値...
-
FORMのselectの選択肢を最初か...
おすすめ情報