- 締切済み
UTF-8で文字化けしないようにするには?
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 }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- gentaro
- ベストアンサー率47% (105/221)
あまりお役に立てなくて申し訳ありません。 もしかすると、このCGIはご自分で作成したものではないのでしょうか? 今更Jcode.plのテストをしてもしょうがないですね。 調べる時間の節約なら、UTF-8対応のperlのメールフォームフリーCGIをダウンロードして、その中身を見るのが早いかも、ですね。
- gentaro
- ベストアンサー率47% (105/221)
#1です ごめんなさい、徹夜で頭がボケてます http://openlab.ring.gr.jp/Jcode/index-j.html にjcode.plからの移行方法と、HTML化したマニュアルがありますので 読んでみてください。 文字列のエンコード方法はjcode.plとは違うと思います。 その前に、現環境で$msgにSJIS、EUCを入れてみて文字化けしないか どうかを確認したほうがいいと思います。 これで正しくJISにエンコードされればjcode.plがUTF-8をサポート してない、ということになると思いますので。
- t-okura
- ベストアンサー率75% (253/335)
文字化けするのは、送信されたメールでしょうか。 それともウェブページでしょうか。 少し気づいた点としては、 ・ UTF8 で保存したスクリプトに日本語が含まれるのであれば use utf8; とした方がよいでしょう。 ・ メールの件名は mimeencode する前に JIS に変換する必要はないので しょうか。 ・ ウェブページの文字コードは meta で指定するだけでなくヘッダでも Content-type: text/html; Charset=UTF-8 として指定した方がよいでしょう。 これで文字化けがおさまるかどうかは、ちょっと自信ありませんが、 参考までに。
お礼
お返事ありがとうございます。 文字化けするのはメールです。 #!/usr/bin/perl use utf8; require "jcode.pl"; require "mimew.pl"; としてみたのですがweb(送信内容を表示するtextarea内のみ)も 文字化けしてしまいました。 >メールの件名は mimeencode する前に JIS に変換する必要はないので しょうか。 あまり知識がないので方法はわからないのですが最終的にjisに変換して メール送信が無難ですよね・・・
- gentaro
- ベストアンサー率47% (105/221)
perlは何年も触ってないのですが、確か jcode.plはUnicode(UTF-8)に 対応してないんじゃなかったかな、と。 jcode::jis($msg); 試しに,$msgにSJIS、EUCを入れてみて文字化けしなければそうですね。 perl5ならjcode.pmを使えば確実 http://openlab.ring.gr.jp/Jcode/index-j.html 違う理由ならごめんなさい
お礼
お返事ありがとうございます。 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を見てみたのですがよくわからずでとりあえず試してみたのですが 使い方が間違っているのでしょうか?
お礼
お返事ありがとうございます。 マニュアルを見てみましたが理解できるまで時間が掛かりそうですが いろいろテストしてみようと思います。 >その前に、現環境で$msgにSJIS、EUCを入れてみて文字化けしないか どうかを確認したほうがいいと思います。 知識がないもので方法がわからないのですがどのようにすればいいのでしょうか?