プロが教える店舗&オフィスのセキュリティ対策術

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);
}
}

A 回答 (3件)

こんにちは、



>$FHND = "<$FileStoragePath/$FileName";
ココで初めて $FileName が登場する気がするんですが。
単なる書き間違いですか?

やっぱ、最初に
use strict;
は必須だと思います。

euc から sjis なら
$str = &jcode::euc2sjis($str);
とかを一度試してみてはどうでしょうか。
jcodeの方で元の文字コードを判別できないと
変換がうまくいかないケースがあった様な気が…(半角カナの時だったっけ?)

この回答への補足

gpさん、早速の回答ありがとうございます。レス遅れてすみません。
補足しますと$FileNameは前ページより引き渡される引数です。ちょっとモジュールから抜けてました、すみません。それで
$str = &jcode::euc2sjis($str);を実際に使用して実行してみましたが同じ状態でした。ラリルレロワヲンが含まれるとだめみたいです。
例えば、
テストル文書1.xls→テスト・・現・ア.xls
(アは本当は半角になってます)
ビデオサンプル.wmv→ビデオサンプ・・.wmv
となってしまいます。他に良い方法はないでしょうか。
すみません、よろしくお願いします。

補足日時:2007/08/17 16:21
    • good
    • 0

こんにちは、


#!perl
use strict;
require 'jcode.pl';
my $str = "テストル文書1.xls";
&jcode::euc2sjis(\$str);
print $str;

euc で保存して、ActivePerl で実行したら
普通に
テストル文書1.xls
と表示されます。

うーん、ちょっとわかんないですね。

>日本語ファイル名(euc)を渡して
これはどんな風に渡されるんですかね。
GET なのか POST なのか、
GET ならリンク自体の文字列はどういう風に生成されているのか?とか、
POST なら、html の文字コードは何なのか?とかが気になるんですけど、
サーバー側でファイルをオープンできるなら、euc ではちゃんとパスが通っているんでしょうし、
クライアント側で一部は正しく表示されるんですよね?
文字コードにあまり明るくないので、ちょっとわかんないですね。
すみません。

この回答への補足

g_p_さん、またまたレスありがとうございます。
文字化けしてるのはどうも、リンクで渡されてきた引数が
そもそも化けています。おかしいです。リンクで表示されている漢字では文字化けしていないのですが、渡した先で表示するとやはり文字化けしています。どういうことだかさっぱりわかりません。リンクで渡す元では、cgiからCを起動して、DBから日本語ファイル名を取得後、print文をCで、発行しています。なぜうまく引き渡せないのか、不思議です。

補足日時:2007/08/17 20:01
    • good
    • 0

こんにちは、



>cgiからCを起動して、DBから日本語ファイル名を取得後、print文をCで、発行しています。なぜうまく引き渡せないのか、不思議です。
C とか知らないへなちょこなんで、呼び出された C のプログラムが print した物が
どうなるのかちょっと理解力が足りなくて申し訳ないですが、(呼び出したスクリプトの標準出力に渡ってくるんですか?)

要は、リンクを張った web ページを生成して表示させていて、
そのリンクをクリックすると、質問文のスクリプトが呼ばれるってことでいいんですかね?

で、
>リンクで表示されている漢字では文字化けしていないのですが
リンクって事は

<a href="xxx.cgi?filename=URLエンコードされたファイル名">文字化けしていないファイル名</a>

って感じなんですかね?
それだったら、URLエンコードの処理が良くないんでしょうかね?

>リンクで表示されている漢字では文字化けしていないのですが
うーん、でも、表示されているのが化けていないってのは、
やっぱフォームですかね?
<input type="text" name="filename">
これなら、html 自体が euc-jp で書かれていて、
charset がeuc-jp でブラウザにちゃんと表示されていれば
普通はちゃんと euc で渡ってくると思うんですけどね…
<form>に accept-charset="euc-jp" を指定してみるとか…ですかね
    • good
    • 0

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