AIと戦って、あなたの人生のリスク診断 >>

このcgiはファイルをアップロードとダウンロードすることが出来るcgiです。

日本語名のついたファイルをアップロードするときは文字化けもなく保存できるのですが、そのファイルをダウンロードすると日本語が文字化けしてダウンロードされてしまいます。

アップロードした時点で Fileというフォルダに格納されるのですが、そのときはまだ格納されたファイルは文字化けはしていません。cgi上に表示されているファイル名も文字化けはしていません。

ダウンロードするファイルを選択した時点で文字化けしたアドレスがIEの下に表示されます。そして、その文字化けの文字のままファイル名となってダウンロードされてきます。
yahooのブリーフケースに日本語のファイル名をアップした時のURLの文字化けに似ているような気がします。
でもyahooの場合はダウンロードしてもファイル名は文字化けしていないのです。

ご指導よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

サーバに置くファイル名には日本語名は使わないというのが鉄則なのですが...



サーバに保存されている時はWebを使用してるので、ちゃんとコード変換されて
いるように見えるけど、サーバのファイルシステムで確認すると実際には文字化け
していて、それがダウンロードする時に表示されるのではないでしょうか?

サーバのメンテナンス時などに日本語のファイル名を付けられていると
そのフォルダでバックアップ処理が止まったりして結構やっかいな事に
なりますので、できれば日本語ファイル名はやめたほうがいいかも。
    • good
    • 0

基本的にWEBで日本語(2バイト文字)は使用してはいけません(ファイル名とかのことね)。


それはWEB環境によって文字コードの違いとかがあるためです。
WINはsjisで動作していますが、Lunix系だとEUCが基本です(場所によっては違うと思いますが)。

もしそれでも使いたい場合はファイル名をエンコードするべきです。

http://サイト/なんとか.cgi?q=%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91
といった感じに、URLエンコードとか。base64 とか unicode とか。
で、アップロード/ダウンロードする側のスクリプトでデコードをしてやれば理論的に出来るはずです。

ただ、WEBでは日本語は使ってはいけないという前提条件が私の中であるので、お勧めはしませんが。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPerl:ファイル名だけ文字化けする

Perlをいじって2日の者です。
WindowsVistaを使っております。

現在renameを使ってファイル名を変更しようとしています。

現在のファイル名がIDだけで、
Web上にあるそのIDに対応する情報をファイル名に追加しようとしています。

Web上の情報を取得するまではできたのですが、
変数に入れたその情報を、ファイル名に入れようとすると文字化けします。
ただ、その情報をコマンドプロントで扱う時も、テキストへ出力してみても文字化けしません。

文字化けは、文字コードなるものが原因らしいということで、
とりあえずよく見かける「UTF-8」というものにエンコードしてみたところ、
テキストへの出力が、ファイル名へのそれと同様に文字化けしました。

エンコードした上でファイル名に入れようとすると
情報のそのものがないものとして扱われるようになりました。

これはどう解釈すればいいのでしょうか?
どうすれば文字化けを解決できるでしょうか?

Aベストアンサー

UTF8フラグを外せばよいです。

Windows XP では 下のスクリプトをUTF8 で保存し、実行すると文字化けしないで「かきくけこ.txt」が作成されます。文字コードにCP932を指定していますが、SJISとほぼ同じです。

Vista でも同じではないでしょうか。

use strict;
use warnings;
use Encode;
use utf8;

my $file_name="あいうえお.txt";
open my $out, ">", Encode::encode('CP932', $file_name) or die;
print $out Encode::encode('CP932', "こんにちは\n");
close $out;

my $new_name = "かきくけこ.txt";
rename Encode::encode('CP932', $file_name), Encode::encode('CP932', $new_name);

exit;

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

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

nakamuraと申します。
 あるweb上のリンクからファイルをクライアント側にてダウンロードするプログラムを作成しました。リンクからcgi(Perl)を起動してそのcgiからファイルダウンロードを実行します。cgiを起動する際、日本語ファイル名(euc)を渡して、それをcgiよりsjisにコンバートしてからダウンロードを実行させています。ある特定の文字だけ文字化けする現象が発覚しました。ある特定の文字とは、ラリルレロワヲン
です。このどれかが一つでも入っているとファイル名が文字化けしてしまいます。他...続きを読む

Aベストアンサー

こんにちは、

>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" を指定してみるとか…ですかね

こんにちは、

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

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

QPerlからメール送信で文字化け

Perl5.8からsendmailを使ってメール送信しています。
髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。



#!/usr/bin/perl
require 'jcode.pl';
require 'mimew.pl';
$sendmail = '/usr/lib/sendmail';

print"Content-type: text/html\n\n test\n";

if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print OUT "To: xxxx\@hogehoge.co.jp\n";
print OUT "From: xxxx\@hogehoge.co.jp\n";
print OUT "Reply-To: xxxx\@hogehoge.co.jp\n";

$subject = "サブジェクト 髙﨑";
$subject = &mimeencode($mail_subject);
print OUT "Subject: $mail_subject\n";

print OUT "Mime-version: 1.0\n";
print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n";
print OUT "Content-Transfer-Encoding: 7bit\n\n";

$honbun = "メール本文 髙﨑";
&jcode'convert(*honbun, 'jis');
print OUT "$honbun\n";

close(OUT);

Perl5.8からsendmailを使ってメール送信しています。
髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。



#!/usr/bin/perl
require 'jcode.pl';
require 'mimew.pl';
$sendmail = '/usr/lib/sendmail';

print"Content-type: text/html\n\n test\n";

if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print OUT "To: xxxx\@hogehoge.co.jp\n";
print OUT "From: xxxx\@hogehoge.co.jp\n";
print OUT "Reply-To: xxxx\@hogehoge.co.jp\n";

$subject = "サ...続きを読む

Aベストアンサー

根本的には perl の問題ではありません。
「髙」や「﨑」といった文字は、JIS(ISO-2022-JP)では規定されていないため、
ISO-2022-JPのメールに入れることはできないのです。

文字コードがUnicodeであれば、「髙」や「﨑」を表現できますので、

・perlのスクリプトを、Unicode(UTF-8)で記述するようにする
・メールのcharset を UTF-8で送信するようにする
・文字コードの変換を、perl4時代の古いライブラリ(Unicode非対応)である「mimew.pl」や「jcode.pl」ではなく、perl5世代の「Encode.pm」を使う

という対応になるかと思います。

---ここから---
#!/usr/bin/perl
use strict;
use utf8;

use Encode;

my $sendmail = '/usr/lib/sendmail';

print "Content-type: text/html\n\n test\n";

my $out;
if (!(open($out,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print $out "To: xxxx\@hogehoge.co.jp\n";
print $out "From: xxxx\@hogehoge.co.jp\n";
print $out "Reply-To: xxxx\@hogehoge.co.jp\n";

my $mail_subject = "サブジェクト 髙﨑";
$mail_subject = encode('MIME-Header', $mail_subject);
print $out "Subject: $mail_subject\n";

print $out "Mime-version: 1.0\n";
print $out "Content-Type: text/plain\; charset=\"UTF-8\"\n";
print $out "Content-Transfer-Encoding: 8bit\n\n";

my $honbun = "メール本文 髙﨑";
$honbun = encode("UTF-8", $honbun);
print $out "$honbun\n";

close($out);
---ここまで---

といった形でしょうか。

ただし、最近はまず大丈夫だと思いますが、
「日本語のメール」としては、ISO-2022-JPで送るのが主流であり、UTF-8で送った場合にはメールソフトによっては問題が出るかもしれないことは覚悟する必要があるかと思います。

根本的には perl の問題ではありません。
「髙」や「﨑」といった文字は、JIS(ISO-2022-JP)では規定されていないため、
ISO-2022-JPのメールに入れることはできないのです。

文字コードがUnicodeであれば、「髙」や「﨑」を表現できますので、

・perlのスクリプトを、Unicode(UTF-8)で記述するようにする
・メールのcharset を UTF-8で送信するようにする
・文字コードの変換を、perl4時代の古いライブラリ(Unicode非対応)である「mimew.pl」や「jcode.pl」ではなく、perl5世代の「Encode.pm」を使う

という対...続きを読む

QPerl cgiの文字化けを直したい (UTF8)

現在、jcode.plを使用したShift JISで構成されていた Perlのcgi を UTF-8 に改造しています。

フォームに書き込んだPAGETITLEを別ファイルへUTF-8で書きこむ際に、文字化けしてしまいます。

書きこんだファイルを開けてみると、日本語が文字化けしています(アルファベットは大丈夫)

以下のPerlのPAGETITLEをどのように改造すれば、文字化けしないで、$foundations_fileへUTF-8で書き込みすることができるのでしょうか?

※個人的にはデータ書き込みの sub REGIST 以下を改造すれば良いのではと推測していますが、どうやれば良いのか分かりません。

どうかご教示、よろしくお願い致します。
m(_ _)m

-------------------------------------


#!/usr/bin/perl
use utf8;
binmode STDIN,":utf8";
binmode STDOUT,":utf8";

#基本セットアップファイル読込
require './setup_manage.cgi';

#このファイル
$cgi = "./foundations.cgi";

#デコード処理
&DECODE;


sub VIEW {

#基本設定ファイルの読み込み
&FOUNDATIONS_READ;

【省略】

<TABLE width="100%" border="0" cellspacing="0" cellpadding="1"><TR>
<TD width="70%">変更するデータを直接書き換えて [ 編集実行 ] を押して下さい。</TD>
<FORM method="post" action="./login.cgi">
<TD width="30%" align="right"><INPUT type="submit" value="メインメニューに戻る"></TD>
<INPUT type="hidden" name="mode" value="main">
<INPUT type="hidden" name="pw" value="$in{'pw'}">
</FORM>
</TR></TABLE>

【省略】

<TABLE border="0" cellspacing="1" cellpadding="4" bgcolor="#999999"><TR>

<FORM name="SUBMIT" method="post" action="$cgi" onSubmit="return kakunin()">

<TD width="160" bgcolor="#eeeeee">
<TABLE border="0" cellspacing="0" cellpadding="1"><TR>
<TD>ページタイトル</TD>
</TR></TABLE>
</TD>
<TD width="400" bgcolor="#ffffff">
<TABLE border="0" cellspacing="0" cellpadding="1"><TR>
<TD><INPUT type="text" name="PAGETITLE" size="60" value="$PAGETITLE"></TD>
</TR></TABLE>
</TD>

【省略】

-------------------------------------------------
# データ書き込み
#-------------------------------------------------
sub REGIST {

#全角英数字を半角に変換
$zenkaku = '0123456789';
$hankaku = '0123456789';

$in{'PAGETITLE'} =~ s/\,/&%/g;
$in{'PAGE1'} =~ s/\,//g;
$in{'PAGE2'} =~ s/\,//g;
$in{'PAGE3'} =~ s/\,//g;
$in{'CATECOL'} =~ s/\,//g;
$in{'PERIOD'} =~ s/\,//g;
$in{'TABLECOL'} =~ s/\,//g;
$in{'SIZECOL'} =~ s/\,//g;
$in{'SIZEROW'} =~ s/\,//g;
$in{'COPYRIGHT'} =~ s/\,/&%/g;


#ファイルロック開始
if( $lockkey ne '0' ){ &LOCK; }

#ファイルに書きこむ
if (!open(OUT,">:utf8",$foundations_file)) { &ERROR( read_foundations ); }

print OUT "$datenow,$in{'PAGETITLE'},$in{'INIMODE'},$in{'MODECHG'},$in{'PAGE1'},$in{'PAGE2'},$in{'PAGE3'},$in{'CATEVIEW'},$in{'CATECOL'},$in{'INICATE'},$in{'PERIOD'},$in{'RANKING'},$in{'CMODE'},$in{'RANKVIEW'},$in{'TITLEVIEW'},$in{'SRCHVIEW'},$in{'INPVIEW'},$in{'DATAROW'},$in{'TABLECOL'},$in{'BARCLR'},$in{'BARPER'},$in{'IMGPRT'},$in{'IMGSIZE'},$in{'SIZECOL'},$in{'SIZEROW'},$in{'IMGFRM'},$in{'COPYRIGHT'},$in{'GPVIEW'},";
close(OUT);


#ファイルロック解除
if( $lockkey ne '0' ){ &UNLOCK; }

&COMP;
}

現在、jcode.plを使用したShift JISで構成されていた Perlのcgi を UTF-8 に改造しています。

フォームに書き込んだPAGETITLEを別ファイルへUTF-8で書きこむ際に、文字化けしてしまいます。

書きこんだファイルを開けてみると、日本語が文字化けしています(アルファベットは大丈夫)

以下のPerlのPAGETITLEをどのように改造すれば、文字化けしないで、$foundations_fileへUTF-8で書き込みすることができるのでしょうか?

※個人的にはデータ書き込みの sub REGIST 以下を改造すれば良いのではと推測しています...続きを読む

Aベストアンサー

どう「実際に Encode::decode を使ったのか」が疑問ですが.... 少なくとも, pack しただけでダメなのは文字数を考えれば明らかで, 「pack で得られた文字列を改めて UTF-8 として解釈し直す」というのは必須なはず.

あと, 「フォームで出てくる」というときに, フォントなんかも問題になりえる. そもそも UTF-16 な出力をしているときに UTF-8 な出力をしちゃったらどう考えてもダメだし, あるいは「理由はさておき UTF-8 な文字コードを上手く扱えないフォントレンダラー」だったりするとやっぱり UTF-8 じゃダメだよね. ということは, 「フォームの表示を見る」だけではダメで, HTML (なり XHTML なり) のレベルで正しくなっているかどうかから考えなきゃならないような感じがします.


人気Q&Aランキング