- PR -

ファイルダウンロード時のファイル名文字化け

投稿者投稿内容
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2007-08-10 18:31
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:不明
クライアント側IE:6.0SP2
念のため下記にコードを記します。
#!/usr/local/bin/perl
require '../cgi-lib.pl';
require '../jcode.pl';
# 入力データを連想配列に読み込む
&ReadParse(*in);
# パラメータを変数に代入する。
#日本語ファイル名
$OriginalFileName = $in{'OriginalFileName'};
#ファイル保管ディレクトリの絶対パス
$FileStoragePath = '/html/file/';

# 日本語文字列の編集(ダウンロードファイル名をShift-JISへ変換)
&jcode'convert(*OriginalFileName, 'sjis');

# ファイル出力処理実行
&outputFile();
exit(0);

sub outputFile
{
$FHND = "<$FileStoragePath/$FileName";
if (open FHND) {
print ("Content-type: Application/octet-stream\n");
# print ("Content-Disposition: attachment; filename=\"download_$FileName\"\n\n");
print ("Content-Disposition: inline; filename=\"$OriginalFileName\"\n\n");
while (<FHND>) {
print $_;
}
close FHND;
} else {
&outputErrHtml("ファイル読み込みに失敗しました。");
exit(0);
}
}
sub outputErrHtml
{
〜エラー表示のためのhtml表示〜
}
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-08-10 18:46
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36881&forum=12
http://www.wsdeveloper.com/viewtopic.php?p=149

[追記]
趣旨がPerlでのサンプルが欲しい、なんですね。
メールの件名に日本語を使う場合のコードを流用出来ると思います。
[/追記]

投稿先の会議室間違えてませんか?
ここはInsider.NETですよ?

[ メッセージ編集済み 編集者: あしゅ 編集日時 2007-08-10 18:54 ]
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2007-08-16 11:34
あしゅさん、レスが遅れて申し訳ありません。Perlの質問はどこに投稿すればよかったのか分からず、投稿先も間違えてしまいました。
早速ですが、あしゅさんに教えていただいたページを見てこれをPerlに直すのが至難の業で。。下記のところがどうしてもわかりません。(Perl初心者です。)
byte[] array = str.getBytes(encoding);
StringBuffer buf = new StringBuffer();
for (int i = 0; i < array.length; i++) {
buf.append(byteToStr[byteToInt(array[i])]);
}
return buf.toString();

上記でまず、引数で渡された文字列をUTF-8に変換している箇所のPerlのコードがわかりません。そしてそれを変数byteの配列にセットするところも調べたのですがとんとわかりませんでした。それとbufの宣言、そのbufに追加でセットしているのは、単にファイルbufに文字列を追加しているということでしょうか?
本当に初心者で申し訳ありませんが、ご教授願いますでしょうか。もしくはヒントを与えてやってくれないでしょうか。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-08-16 13:47
引用:

やすけさんの書き込み (2007-08-16 11:34) より:
上記でまず、引数で渡された文字列をUTF-8に変換している箇所のPerlのコードがわかりません。


PerlならEncode.pmを使うのでは?

http://search.cpan.org/dist/Encode/Encode.pm

#jcode.plはutf-8非対応だったかと思います。
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2007-08-16 14:13
引用:

shimixさんの書き込み (2007-08-16 13:47) より:
引用:

やすけさんの書き込み (2007-08-16 11:34) より:
上記でまず、引数で渡された文字列をUTF-8に変換している箇所のPerlのコードがわかりません。


PerlならEncode.pmを使うのでは?

http://search.cpan.org/dist/Encode/Encode.pm

#jcode.plはutf-8非対応だったかと思います。

やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2007-08-16 14:20
引用:

PerlならEncode.pmを使うのでは?

http://search.cpan.org/dist/Encode/Encode.pm

#jcode.plはutf-8非対応だったかと思います。

すみません、さきほどそのまま返信してしまいました。
上記のページは英語でしたので日本語の同じページがありましたので
(http://digit.que.ne.jp/work/index.cgi?Encode)
そこをみたら、要はuse Encode;を宣言してutf-8に変換するってことで
よいのですか?すみません、Perl初心者なおかつEncode.pmを使用したことが
ないので、トンと分からなくてぶしつけな質問ですみません。
これを使用することによって文字化けは解決されるのでしょうか。

shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-08-16 16:12
#日本語のファイル名を使わないのが一番なのは間違いないですけどね・・

引用:

やすけさんの書き込み (2007-08-16 14:20) より:
要はuse Encode;を宣言してutf-8に変換するってことで
よいのですか?


UTF-8に変換したければそれが常道です(と書いたつもりだった)。

引用:

これを使用することによって文字化けは解決されるのでしょうか。


あしゅさんが書かれたURLはご覧になってるんですよね?他の言語で書かれたものと同じようにレスポンスを返せば当然同じ動作になります。クライアントはサーバ側の言語が何であるかは無関係ですから。
やすけ
ベテラン
会議室デビュー日: 2003/08/20
投稿数: 87
投稿日時: 2007-08-16 16:27
引用:

あしゅさんが書かれたURLはご覧になってるんですよね?他の言語で書かれたものと同じようにレスポンスを返せば当然同じ動作になります。クライアントはサーバ側の言語が何であるかは無関係ですから。


引用:

そうですよね。
まあ、本当は日本語使用しないほうがいいのですが、そうもいかなくて。
そもそもsjisに変換していたのですが、リンクで引き渡したファイル名はeucだと
思うのですが、それをsjisに変換するともっとひどい文字化けになってしまいます。
eucで引き渡されていないということなのでしょうか。
以前は
&jcode'convert(*OriginalFileName, 'sjis');
今回Encode.pmを使用して
$OriginalFileName = decode('sjis', $OriginalFileName);
とやってみました。
根本的に間違っていますでしょうか。



スキルアップ/キャリアアップ(JOB@IT)