好きな人を振り向かせるためにしたこと

Shift-jisのページだったのですがリニューアルを機に文字コードを
utf-8に変更してページを作っています。

メールフォーム用のcgiは以前と同じものを使いたいのですがページを
utf-8で作ったために送信すると文字化けしてしまいます。

cgi自体をutf-8で保存しましたが同じ結果でした・・・
確認ページがあるわけでもなく必須の項目が埋まっていれば送信するような
シンプルなものなのですがutf-8で文字化けしないようにするには
どのように変更したらいいのでしょうか?
ソースは以下の通りです。

#!/usr/bin/perl
require "jcode.pl";
require "mimew.pl";

$SENDMAIL = '/usr/sbin/sendmail';
$MAILTO = 'mail@example.com';
$MAILSUBJECT = 'メールフォームより';

$query = $ENV{'QUERY_STRING'};

foreach $pair (split(/&/, $query)) {
($key, $value) = split(/=/, $pair);

$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;

$form{$key} = $value;
}

$msg .= "----- 連絡先 -----\n";
~~フォーム処理につき省略~~

if ($bad_input) {

print <<END;
Content-type: text/html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>エラー</title>
</head>
<body>
<center>
<h1>エラー</h1>
<div>必須項目が入力されていません。</div>
</center>
</body>
</html>
END

}else {

$mail_to = mimeencode($MAILTO);
$mail_from = mimeencode($form{'mail'});
$mail_subject = mimeencode($MAILSUBJECT);

$body = jcode::jis($msg);

$head = <<END;
To: $mail_to
From: $mail_from
Subject: $mail_subject
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP

END

open (MAIL, "| $SENDMAIL -i -t -f $form{'mail'}")
or die("Error: Can't open pipe for sendmail");
print MAIL $head, $body;
close MAIL;

print <<END;
Content-type: text/html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>送信完了</title>
</head>
<body>
<center>
<h1>送信完了</h1>
<div>下記の内容で送信しました.</div>
<textarea cols="48" rows="24">
$msg
</textarea>
</center>
</body>
</html>
END
}

A 回答 (4件)

あまりお役に立てなくて申し訳ありません。


もしかすると、このCGIはご自分で作成したものではないのでしょうか?

今更Jcode.plのテストをしてもしょうがないですね。

調べる時間の節約なら、UTF-8対応のperlのメールフォームフリーCGIをダウンロードして、その中身を見るのが早いかも、ですね。
    • good
    • 0

#1です



ごめんなさい、徹夜で頭がボケてます

http://openlab.ring.gr.jp/Jcode/index-j.html
にjcode.plからの移行方法と、HTML化したマニュアルがありますので
読んでみてください。
文字列のエンコード方法はjcode.plとは違うと思います。

その前に、現環境で$msgにSJIS、EUCを入れてみて文字化けしないか
どうかを確認したほうがいいと思います。
これで正しくJISにエンコードされればjcode.plがUTF-8をサポート
してない、ということになると思いますので。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

マニュアルを見てみましたが理解できるまで時間が掛かりそうですが
いろいろテストしてみようと思います。

>その前に、現環境で$msgにSJIS、EUCを入れてみて文字化けしないか
どうかを確認したほうがいいと思います。

知識がないもので方法がわからないのですがどのようにすればいいのでしょうか?

お礼日時:2008/02/24 18:44

文字化けするのは、送信されたメールでしょうか。


それともウェブページでしょうか。

少し気づいた点としては、
・ UTF8 で保存したスクリプトに日本語が含まれるのであれば
use utf8; とした方がよいでしょう。
・ メールの件名は mimeencode する前に JIS に変換する必要はないので
しょうか。
・ ウェブページの文字コードは meta で指定するだけでなくヘッダでも
Content-type: text/html; Charset=UTF-8
として指定した方がよいでしょう。

これで文字化けがおさまるかどうかは、ちょっと自信ありませんが、
参考までに。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
文字化けするのはメールです。

#!/usr/bin/perl

use utf8;

require "jcode.pl";
require "mimew.pl";

としてみたのですがweb(送信内容を表示するtextarea内のみ)も
文字化けしてしまいました。

>メールの件名は mimeencode する前に JIS に変換する必要はないので
しょうか。

あまり知識がないので方法はわからないのですが最終的にjisに変換して
メール送信が無難ですよね・・・

お礼日時:2008/02/24 16:18

perlは何年も触ってないのですが、確か jcode.plはUnicode(UTF-8)に


対応してないんじゃなかったかな、と。

jcode::jis($msg);

試しに,$msgにSJIS、EUCを入れてみて文字化けしなければそうですね。

perl5ならjcode.pmを使えば確実
http://openlab.ring.gr.jp/Jcode/index-j.html

違う理由ならごめんなさい
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
Jcode-2.06.zipをダウンロードしてその中のJcode.pmのみをアップして
cgiを以下のように変更しました。

#!/usr/bin/perl

use Jcode;

$SENDMAIL = '/usr/sbin/sendmail';
・・・
$body = Jcode::jis($msg);
・・・

送信するとwebページはInternal Server Errorとなり
メールは送信されない状態です。

参考urlを見てみたのですがよくわからずでとりあえず試してみたのですが
使い方が間違っているのでしょうか?

お礼日時:2008/02/24 16:42

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報