• 締切済み

文字化けの事で?

あるCGIを無料でダウンロードしました。 そのCGIはステップメールなのですが、使ってみていくつか弱点がありました。 特に気になるのはgmailだと文字化けしてしまう事です。 CGIとか全然いじった事がないからよくわからいのですが、プログラムのなかにデコード処理とかあったのでたぶんこれかと思いました。 以下のプログラムで何かおかしい(文字化けを起こす原因)箇所はあるのでしょうか? #//■デコード sub decode { local($buf, $key, $val); if (($ENV{'REQUEST_METHOD'} eq "POST") and ($post_flag ne 1)) { $post_flag=1; read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $post_flag=0; $buf = $ENV{'QUERY_STRING'}; } #csystem ($lc)=jcode::csystem($SCRIPT); foreach (split(/&/, $buf)) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # S-JISコード変換 &jcode'convert(*val, "sjis", "", "z"); # 不要コード排除 $val =~ s/"/&quot;/g; $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; if($key ne "comment"){ $val =~ s/\r|\n|\0//g; }else{ $val =~ s/\r|\0//g; } $in{$key} = $val; }

  • Perl
  • 回答数2
  • ありがとう数3

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

>この場合はもうどうしょうもないのでしょうか? jcode.pl を使う限りでは。 UTF-8も扱うことのできるJcode.pmを使うとか手段はありますが、 細大漏らさず説明を書くには文字数が足りません。 あるいはgmail側の設定の Use default text encoding for outgoing messages Use Unicode (UTF-8) encoding for outgoing messages というメッセージの符号化に関する選択で上の default text encoding を選択するとか。 こっちは自信ないですけど。

torasan117
質問者

お礼

ご回答ありがとうございます。 今回はこのCGIはあきらめました。別のCGIがあったのでそちらを使います。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

たぶん gmailからは文字コードが utf-8できていて、 ># S-JISコード変換 >&jcode'convert(*val, "sjis", "", "z"); jcode.plで行っているであろうこの変換が失敗している(jcode.plはutf-8をサポートしていません) のではないかと思います。

torasan117
質問者

お礼

ご回答ありがとうございます。 この場合はもうどうしょうもないのでしょうか? 対策などあったら教えてください。 よろしくお願いします。

関連するQ&A

  • METHOD=GETでパラメータを渡す時に日本語が文字化けする。

    以下のようにMETHOD=GETでCGIスクリプトにパラメータを渡してQUERY_STRINGから読み出す場合、$a_wordが日本語だと文字化けして正しく送れません。 http://~/~/wwwperl.cgi?mode=tophtml&page=$next_line&a_word=$a_word http://~/~/wwwperl.cgi?mode=tophtml&page=10&a_word=テレビ朝日 $a_wordの「テレビ朝日」が「テ・E喞・」となってしまう。 フォームで送ればちゃんと表示されるのですが、ここはどうしてもMETHOD=GETで渡したいのです。 どなたか理由または解決方法を教えていただけると嬉しいのですが・・・ スクリプトはEUCで書いています。Jcode.pmを使用。 エンコード部分はこんな感じです。 sub decode { my $buf; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } foreach ( split(/&/, $buf) ) { my ($key, $val) = split(/=/); $key =~ tr/+/ /; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; Jcode::convert(\$val, 'euc'); $FORM{$key} .= "\0" if (defined($FORM{$key})); $FORM{$key} .= $val; } $mode = $FORM{'mode'}; $page = $FORM{'page'}; $a_word = $FORM{'a_word'}; }

    • ベストアンサー
    • Perl
  • リクエストパラメタを一括置き換え

    リクエストパラメタを一括置き換え if( $ENV{'REQUEST_METHOD'} eq "GET" ) { $buffer = $ENV{'QUERY_STRING'}; } else { read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); } %req_params = map { /([^=]+)=(.+)/ } split /&/, $buffer; 上記のように書いていて、リクエストされたものを置き換える時は次のように一個一個書いています。 $req_params{name} =~ s/&/&amp;/g; $req_params{mail} =~ s/&/&amp;/g; $req_params{url} =~ s/&/&amp;/g; このリクエストされたパラメタを一括で置き換えするにはどうすればいいのでしょうか? 例えば、上記の書き方で以下のようなことをしたいです。よろしくお願いいたします。 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } foreach ( split(/&/, $buf) ) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $val =~ s/&/&amp;/g; $req_params{$key} .= "\0" if (defined($req_params{$key})); $req_params{$key} .= $val; }

    • ベストアンサー
    • Perl
  • 「繝・せ繝・」となる文字化け

    「テスト」を以下でデコードすると「繝・せ繝・」となってしまいます。 URL test.cgi/q_テスト/ $ENV{'PATH_INFO'}と「q_テスト」を使うことを前提として、「テスト」と正常に取る方法はありますでしょうか。 ご教授お願いします。 $buffer = $ENV{'PATH_INFO'}; $buffer = substr($buffer,1); @lens = split(/\//,$buffer); foreach $len(@lens){ ($name, $value) = split(/_/,$len,2); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/\t/ /g; $value =~ s/\n//g; $FORM{$name} = $value; }

    • ベストアンサー
    • Perl
  • デコードフォームについて。

    以下のスクリプトについて質問があります。かなり多いのですが・・・ sub DecodeForm #返り値:Name=>Val のハッシュ(グロブ) #使用例:*form = EncodeForm(); print $form{name}; { my($encoding) = @_; my($method) = $ENV{'REQUEST_METHOD'}; local($query, @in, $key, $val); require 'jcode.pl' if $encoding; if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; } elsif ($method eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } local(@query) = split(/&/, $query); foreach (@query) { tr/+/ /; ($key, $val) = split(/=/); # %HH形式を元の文字にデコードする。 $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/\r\n/\n/g; jcode'convert(*key, $encoding) if ($encoding); jcode'convert(*val, $encoding) if ($encoding); $in{$key} = $val; } return *in; } 多いので先頭から順に箇条書きにさせて頂きます。 ・Name=>Val の意味。(#以下がメモであることは分かっています) ・グロブとは何か ・*form = EncodeForm(); print $form{name}; の意味。(特に、先頭の*が分かりません) ・my $encoding という変数も見たことがあるのですが、my($encoding) と my $encoding はどう違うのか。 ・クエリとは何か ・jcode.pl とは、インストールしたPerlに標準でついているライブラリなのか?そうでないのならjcode.plとは何か? ・%HH形式とは何か ・\rの意味 ・jcode'convert の意味 ・*key の * の意味 ・*in の * の意味 多くて申し訳ないです。分かる方いらっしゃいましたご教授くださると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 半角カナを検出したい

    フォーム入力の半角カナを検出または全角に変換したいです。 ここで同じような質問をいくつかみて、いろいろ試しましたが どうもうまくいきません。 jcode.pl,v 2.6です。 デコード部分は以下のようになってます。 #!/usr/bin/perl require 'jcode.pl'; print "Content-type: text/html\n\n"; $request_method=$ENV{'REQUEST_METHOD'}; if($request_method eq "POST"){ read(STDIN,$query_string,$ENV{'CONTENT_LENGTH'}); }else{ $query_string=$ENV{'QUERY_STRING'}; } @pairs=split(/&/,$query_string); foreach $pair(@pairs){ ($key,$value)=split(/=/,$pair); $key=~ tr/+/ /; $key=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg; &jcode'convert(*key,'sjis'); $key=~ tr/,/_/; $value=~ tr/+/ /; $value=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg; &jcode'convert(*value,'sjis'); $value=~ tr/,/_/; $input{$key}=$value; } よろしくお願いします。

    • ベストアンサー
    • Perl
  • デコードできない時があります><

    なぜか「ひらがな」を偶数個送るとデコードしません 例 「あ」→「あ」 「ああ」→「縺ゅ≠」 「ああい」→「ああい」 「ああいい」→「縺ゅ≠縺・>」 「ああ質問」→「ああ質問」 「ああアあ」→「ああアあ」 今の所漢字やカナを含めて偶数個では問題無いです。 use lib './lib'; use Jcode; read(STDIN, $POST, $ENV{'CONTENT_LENGTH'}); @_post = split (/&/,$POST); foreach $tmp (@_post) { ($name,$value) = split (/=/,$tmp); $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; Jcode::convert($value,"sjis"); $box{$name} = $value; } デコード処理はこんな感じです。 JcodeはJcode-2.07を使ってます。 独自で色々調べたのですが解決策が見つからず大変困っております。 宜しくお願いします。

    • 締切済み
    • CGI
  • Sendmailの文字化けについて

    以前にも同じ質問をしたのですが、いまいち解決していないので、もう一度質問させて頂きます。 ホームページでsendmailをつかってフォームより記入してもらった内容を自分のところと確認メールとして記入した人のところに送るようにしていますが、確認メールが文字化けすることがあるようです。 しかし、全ての人に対して化けるというわけではなく、ほとんどの場合は大丈夫なようですが、一部の人に対してだけ化けるようです。 関係しそうな部分を大まかに書くと下記のようにしておりますが、間違っているでしょうか? if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $xx =$value; &trans; $value = $xx; } sub trans{ $from='[@01-9A-Za-z._-]'; $to='[@01-9A-Za-z._-]'; &jcode'convert(*xx, 'euc'); &jcode'convert(*from, 'euc'); &jcode'convert(*to, 'euc'); &jcode'tr(*xx, $from, $to); &jcode'convert(*xx, 'sjis'); } &jcode'convert(*message,'jis'); if (!open(MAIL,"|$sendmail $mail_address")) {&error;} &jis("Subject: $mailname"); print MAIL "$msg\n"; print MAIL "To: $mail_address\n"; print MAIL "From: $mailfrom\n"; print MAIL "\n"; print MAIL "$message"; close(MAIL); sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis');}

    • ベストアンサー
    • Perl
  • INPUT NAMEの文字化け

    CGIがよく分からない者ですが、会社からホームページ管理を任されてしまいました。申込みフォームがよく使われるんですが、INPUT NAMEを日本語にすると文字化けになり、困っております。ご存知の方、どうか宜しくお願いいたします。 以下、CGIのソースです。 ************************************************* #本文タイトル $honbun_title = '■□ 申込 ■□'; #time #($sec, $min, $hour, $mday, $mon, $year, $wdy, $yday, $isdst) = Localtime(time); $clength = $ENV{'CONTENT_LENGTH'}; if($clength ne '') { read(STDIN, $query_string, $clength); @elements = split(/&/,$query_string); $i = 0; foreach $element (@elements) { (@name[$i], $buf) = split(/=/, $element); $buf =~ tr/+/ /; $buf =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*buf, 'jis'); @value[$i] = $buf; $i++; } &jcode'convert(*honbun_title, 'jis'); &jcode'convert(*ftitle, 'jis'); open (MAIL, "|$sendmail $trans"); print MAIL "From: $smail ($sname)\n"; print MAIL "Subject: $ftitle\n"; # print MAIL "$year\n\n" print MAIL "$honbun_title\n\n"; for($j = 0; $j < $i; $j++) { print MAIL "■@name[$j] : "; print MAIL ": @value[$j]\n\n"; } close(MAIL); print "Location: $query_file\n\n"; }

    • 締切済み
    • CGI
  • 掲示板を作りたい

    perlを勉強中です 掲示板に挑戦してみました 引用の文字色を変えたいと思っています。下記のように>>をいれるとその行の文字色を改行まで変えたいです >>引用文 しかし、やってみると、他の置換えがあってうまくいきません。 どうすればうまくいくのでしょうか? よろしくお願いします sub form_decode{ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form, $ENV{'CONTENT_LENGTH'}); } else { $form = $ENV{'QUERY_STRING'}; $NG = 1; } @pairs = split(/&/,$form); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; $name =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; $value =~ s/>(&gt;[^<]*|>[^<]*)/&gt;&gt;<font color=\"red\">$1<\/font>/g; $value =~ s/>/&gt;/g; $value =~ s/</&lt;/g; $value =~ s/\r//g; $value =~ s/\n//g; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $FORM{$name} = $value; } }

    • ベストアンサー
    • Perl
  • 指定ディレクトリからcookie取得

    $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } $cook{'name'} ./index.cgiで、上記のように$ENV{'HTTP_COOKIE'}でクッキーを取得しています。 このままでは./に保存されたクッキーが取得されてしまいますが、これを、任意のディレクトリ(./../html/等)に保存された場所から取得したいと考えていますが、可能でしょうか。 CGIが設置されているディレクトリ = 'http://hogehoge/cgi-bin/'; COOKIEを読み込むディレクトリ = 'http://hogehoge/html/';

    • ベストアンサー
    • Perl

専門家に質問してみよう