ファイルダウンロードで、DBCSファイル名が文字化け

このQ&Aのポイント
  • Perlでファイルをダウンロードするスクリプトを作成し、DBCSファイル名が文字化けする問題が発生しています。
  • IEとFirefoxでの動作が異なり、ファイル名が化ける原因が特定できません。
  • ブラウザに対してファイル名の文字コードを宣言する方法を調査中です。
回答を見る
  • ベストアンサー

ファイルダウンロードで、DBCSファイル名が文字化け

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 よろしくお願いします。

  • CGI
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

IEの挙動がおかしいんですけどね。 http://web.sfc.keio.ac.jp/~t03920hm/diary/index.php?mode=diary&date=20050315 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)を書くのです。

workpad30j
質問者

お礼

やはりIEがおかしいのですね。 USER_AGENTで分岐させるようにして回避することにします。 やりかたは知っています。 linuxやMacでのテスト環境がないため、少し不安ですが、今の環境は、Windows以外のVisitがありえ無いクローズな環境なので、これでいきます。 ありがとうございました。

その他の回答 (1)

  • n31792
  • ベストアンサー率31% (5/16)
回答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をつけてみて下さい。 それは文字バケの解決には関係ないでしょうけど。。

workpad30j
質問者

補足

回答ありがとうございます。 ブラウザのキャッシュをクリアした後、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

  • 文字化け

    下記のようなcgiスクリプトがあり、test1.cgi から リンクの test2.cgiを呼ぶと 「リンドウ」が文字化けしてしまいます。 文字化けしないようにするには、どうしたらいいでしょうか。 Perl cgi 初心者です。 --------test1.cgi----------------------------------------- #!/usr/bin/perl print "Content-Type: text/html; charset=EUC-JP\n\n"; $name="リンドウ"; print "name=$name<br>"; print "<a href=\"test2.cgi?aaa,${name},bbb\">test2.cgi</a>\n"; ---------test2.cgi------------------------------------------------- #!/usr/bin/perl print "Content-type: text/html; charset=EUC_JP\n\n"; $query = $ENV{'QUERY_STRING'}; print "query=$query\n";

    • ベストアンサー
    • CGI
  • ダウンロード時のファイル名文字化け

    nakamuraと申します。  あるweb上のリンクからファイルをクライアント側にてダウンロードするプログラムを作成しました。リンクからcgi(Perl)を起動してそのcgiからファイルダウンロードを実行します。cgiを起動する際、日本語ファイル名(euc)を渡して、それをcgiよりsjisにコンバートしてからダウンロードを実行させています。ある特定の文字だけ文字化けする現象が発覚しました。ある特定の文字とは、ラリルレロワヲン です。このどれかが一つでも入っているとファイル名が文字化けしてしまいます。他にもあるかもしれませんが、自分が見つけたのはこの文字です。  ちなみに、リンクを右クリックで、対象をファイルに保存だと、ファイル名は文字化けしません。  色々ネットで調べたのですが、対応方法がとんとわかりませんでした。ASP、java等の対応方法はいくらでもあるのですが、cgi(Perl)の対応方法が見つかりません。 どなたかご存知の方いらっしゃいますでしょうか。 ちなみに サーバ側 OS:Red Hat Enterprise Linux ES release 4 (Nahant Update 4) cgi(Perl):5.8.5 クライアント側IE:6.0SP2 念のため下記にコードを記します。 #!/usr/local/bin/perl require '../cgi-lib.pl'; require '../jcode.pl'; &ReadParse(*in); # パラメータを変数に代入する。 #日本語ファイル名 $JPFileName = $in{'JPFileName'}; #ファイル保管ディレクトリの絶対パス $FileStoragePath = '/html/file/'; #日本語文字列の変換 &jcode'convert(*JPFileName, 'sjis'); &outputFile(); exit(0); sub outputFile { $FHND = "<$FileStoragePath/$FileName"; if (open FHND) { print ("Content-type: Application/octet-stream\n"); print ("Content-Disposition: inline; filename=\"$OriginalFileName\"\n\n"); while (<FHND>) { print $_; } close FHND; } else { ~エラー表示のためのhtml表示~ exit(0); } }

  • firefoxの文字化け(エンコーディング誤認)

    firefixで、特定のページを見ると、文字エンコーディングを誤認して文字化けするという症状で困っています。 たとえば、ここ。 http://www.nihonkotsu.co.jp/ ソースを見ると、 <head> <META http-equiv="content-type" content="text/html; charset=Shift_JIS"> という風になっているのですが、ISO-2022-JPだとfirefoxは認識しているようです。IEでは文字化けしません。Firefoxを2.0.1に変えてみましたが、症状は変わりませんでした。 これは、WEBサイトが悪いのでしょうか、僕のFirefoxの設定がどこかおかしいのでしょうか? 

  • ダウンロードファイル名の文字化けについて

    IE画面上にファイル名がリンク表示されており、 ファイル名のクリックで起動されるDownloadServletを作成しました。 日本語を含むファイル名のダウンロードを行うと、 「ファイルのダウンロード」ダイアログではファイル名がきちんと表示されるのですが、 「ファイルの保存」ダイアログでのファイル名が文字化けしてしまいます。 ダウンロード実施後のファイル名も文字化けのままです。 servletでのレスポンスヘッダの設定は以下のように行っています。 res.setContentType("application/octet-stream; charset=Shift_JIS"); res.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8")); 現象が起きている環境はWindows2000Professional, IE6.0で、 WindowsXPなら問題ありませんでした。 例えば「通達.pdf」というファイル名だと、 ”通達”という文字列が”騾夐#”と化けます。 多少調べてみたところURLEncoderではUTF-8コードを%+16進数文字に変換するので、 結果が以下のようになります。 %E9%80%9A%E9%81%94.PDF これをデコード時?にまずUTF-8として読んで、 それからSJIS変換すれば?ちゃんと読めるのかと思うのですが、 どうも「%E9%80%9A%E9%81%94」をそのままSJISコードとしてデコードして 「騾(E980)夐(9AE9)#(8194)」となっている感じです。 ダウンロード処理で出すダイアログはIEに依存しているので 特にデコードなどを自分で行っているわけではないですし、 WindowsXPではちゃんと表示されるなど、 デコード方式がOSに依存?しているような気もするので対処の方法がわかりません。 ダウンロードservletのプログラムの中でどうにか対処できるものなのでしょうか? わかりにくい質問ですみませんが、ぜひご回答よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 文字化け

    登録フォームを作成し、入力した内容でDBに追加を行うなかで、PHPmyadminで実際に見てみると文字化けしています。 レンタルサーバ(OS:linux) (1)登録フォーム(shift_jis) ↓各値を渡す (2)確認ページ(shift_jis) ↓各値をmb_convert_encoding(shift_jisに変更) (3)追加 すると文字化けします。 以前、cgi-lib.plを用いてperlで書いていたものは、 文字化けしていません。 どこがおかしいのでしょうか? ちなみに (1)登録フォーム(euc-jp) ↓各値を渡す (2)確認ページ(euc-jp) ↓各値をmb_convert_encoding(euc-jpに変更) (3)追加 としても文字化けしています。 (DBだけでなく、ページ全体も)

    • ベストアンサー
    • PHP
  • perlでHTML出力時の文字コード

    Perlスクリプト中でHTML出力しているのですが、print "Content-type: text/html\n\n";と記述するとEUCで正常に表示され、print "Content-type: text/html; charset=Shift_JIS\n\n";と明示的にSJISを指定すると空白ページが表示されてしまいます。このスクリプトの他の場所ではprint "Content-type: text/html; charset=Shift_JIS\n\n";で正常にSJISで表示されます。どうしてだかわかりません。どなたかご教授お願いします。

  • TXTに出力すると文字化けが起こる

    Ajaxで送信したデータを元にCGI(Perl)でTXTファイルを書き換えると、 どうしても文字化けしてしまいます。 内容はこんな感じです。無駄な部分は省きました ************************* #!/usr/local/bin/perl print "Content-type: text/html; charset=Shift_JIS\n\n"; use CGI; $n = $q->param("name"); $data = "$nさん、こんにちは"; open(F,"> data.txt"); flock(F,2); print F $data; flock(F,8); close(F); end; ************************* $n(フォームのデータ)は文字化けしないのですが、 「さん、こんにちは」の部分が文字化けしてしまいます。 詳しい方、ご教授願います。

    • 締切済み
    • CGI
  • iframeで文字化けしてしまいます。。

    charset=utf-8"のページでiframeを利用してファイルを読み込んでいます。 firefox3.03とIE7で文字化けが起こります。firefox2.0.0.20とIE6だと正常に見れます。 読み込みたいファイルは.phpです。 同じファイルをcharset=shift_jis"のページから読み込むとfirefox3.0.0.20とIE7、プラスIE6も見られるようです。 charset=utf-8"のままfirefox3.03とIE7で見れるようにするにはどうすればよいでしょうか??  

  • 文字コード変更による、文字化け・レイアウト崩れ

    文字コードをShift-jisからEUC-JPに変更したいのですが、 HTML・CSSに処理を施したら文字・レイアウトが大幅に崩れてしまいました。 以下のように変更したのですがやり方に間違いはないでしょうか? [HTML] <meta http-equiv="Content-Type" content="text/html; charset=Shift-jis"> ↓↓ <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> [CSS] @charset "shift_jis"; ↓↓ @charset "euc-jp"; また、ブラウザの表示⇒エンコードで(Shift_jis)を選択すると今までどおり正常に表示されます。(HTMLとCSSにはeuc-jpの記述にも関わらずです) これは文字コード変更したと思い込んでしまっているのでしょうか? 解決策お願いします。 あまり知識がありませんので、分かり易く教えていただけるとありがたいです。 ちなみにエディタはHTML Project2を使用しています。

  • 文字化けを直す方法

    ホームページ作成中です。 あるCGIで出来たリストの一部だけをSSIで表示させようとしています。 イメージとしては買い物籠CGIの登録されている商品名だけを一覧表示みたいなものです。 リストのdatファイルは「EUC」で保存されています。 下の表示させるCGIと表示先のhtmlは「S-JIS」で保存しています。 リスト表示は他のCGIからコピーして少々変更しただけの物です。 ------------------------ #!/usr/bin/perl require './jcode.pl'; #jcode::convert(\$str, 'euc', $code); print "<center>\n"; print "<TABLE>\n"; print "<TR><TD>語録一覧</TD>\n"; print "</TR>\n"; print "<TR><TD>\n"; open (FILE2,"./data/word.dat"); @file = <FILE2>; close FILE2; $no = -1; foreach (@file) { $no++; # local($file,$number,$word,$yomi)= split /\t/,$data[$i]; local($file,$number,$word,$yomi)= split /\t/; print "$word<BR>\n"; } print "</td></TR>\n"; print "</table>\n"; print "</CENTER>\n"; exit; ------------------------------- こうすると、リスト($word)が文字化けします。(英数は化けずに表示。って当たり前ですね) どうにかしてEUCのリストのみ表示するときS-JISに変換する方法などないでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう