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);
}
}
No.1
- 回答日時:
こんにちは、
>$FHND = "<$FileStoragePath/$FileName";
ココで初めて $FileName が登場する気がするんですが。
単なる書き間違いですか?
やっぱ、最初に
use strict;
は必須だと思います。
euc から sjis なら
$str = &jcode::euc2sjis($str);
とかを一度試してみてはどうでしょうか。
jcodeの方で元の文字コードを判別できないと
変換がうまくいかないケースがあった様な気が…(半角カナの時だったっけ?)
この回答への補足
gpさん、早速の回答ありがとうございます。レス遅れてすみません。
補足しますと$FileNameは前ページより引き渡される引数です。ちょっとモジュールから抜けてました、すみません。それで
$str = &jcode::euc2sjis($str);を実際に使用して実行してみましたが同じ状態でした。ラリルレロワヲンが含まれるとだめみたいです。
例えば、
テストル文書1.xls→テスト・・現・ア.xls
(アは本当は半角になってます)
ビデオサンプル.wmv→ビデオサンプ・・.wmv
となってしまいます。他に良い方法はないでしょうか。
すみません、よろしくお願いします。
No.2
- 回答日時:
こんにちは、
#!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で、発行しています。なぜうまく引き渡せないのか、不思議です。
No.3ベストアンサー
- 回答日時:
こんにちは、
>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" を指定してみるとか…ですかね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Google Drive 【Googleドライブ】ドライブ上内でのフォルダ移行について 4 2022/11/30 12:50
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- その他(メールソフト・メールサービス) メールソフトを教えてください 1 2023/03/28 23:32
- Visual Basic(VBA) VBAでエクセルをtxtに変換するとエクセルでカンマを含む文字数字がtxtでは「""」付にならないよ 1 2022/08/27 12:17
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
useとrequireでエラー
-
www.URL 付のcgi を動かす
-
perlのrequireの動き方について...
-
use strictとグロブ?
-
gifcat.pl:助言お願い致します
-
cgiからcgiをコールする。
-
Quantifier follows nothing in...
-
月の第一週とは
-
よくある 『 第○(1・2・3・4・...
-
アンケートなどの1日1回の投...
-
perlでHTTP Request Headersの...
-
VBA。複数のChangeイベントをま...
-
毎○曜日って、使いますか?
-
週2回のペースって だいたい何...
-
シングルサインオンのような仕...
-
毎週同じ曜日にラブホに行くと...
-
燃えるゴミの日は何曜日ですか?
-
エクセルで毎月第2週日の水曜日...
-
Perl の外部モジュールの利用方法
-
HTTPヘッダの取得方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
cgiとplとpm
-
perlのrequireの動き方について...
-
jcode.plが読み込めない
-
Quantifier follows nothing in...
-
require文が実行できない
-
ファイル書込時にPermission de...
-
useとrequireでエラー
-
htmlからテキストを返すperlを...
-
Perlのデバッグ方法って。。。...
-
PDFJが動作しない
-
画像のURLの変数を別のCG...
-
perlのcgiで、変数の中身を表示...
-
perlをインストールしたのに使...
-
CGIの中にinclude
-
gifcat.pl:助言お願い致します
-
phone.plというモジュールを使...
-
Perlの作動不具合、missing bra...
-
プログラムを書き足すことについて
-
Not Found 404エラー時のCGI出力
-
バイナリファイルのアップロード
おすすめ情報