• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cgiメールの文字変換がうまくできない)

cgiメールの文字変換ができない

このQ&Aのポイント
  • cgiメールの文字変換がうまくできないため、文字化けが発生してしまう。
  • タイトル部分は正しく表示されるが、ボディー部分が文字化けする。
  • Encode::from_to関数の引数を調整しても改善されないため、原因を特定できていない。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> foreach ( split(/\n/, $body) ) { > &jis("$_"); > print MAIL $_, "\n"; > } Shift_JISの$_をそのまま出力してるから。 現在の&jisの仕様は ・引数: shift_jisの文字列 ・戻り値:無し ・副作用: グローバル変数 $msgが、入力引数のshift_jis文字列をISO-2022-JPに変換した文字列になる です。 > また、元々参考にしたものでは####1####に > retern $msg; > があったのですが、これを入れるとsyntax errorになったので、これをコメントアウトしたらエラーにはならず送信そのものはできました 「return」 です。スペルが違います。 エラーになったからコメントアウト、では何の解決にもなりません。 「なんでもOK」なPerlですが、ある程度のものを作ろうと思ったら、やはり、プログラム構造はちゃんとした方がよいです。 グローバル変数は必要以上に使わないことです。 use strict ; を入れて変数宣言を強制するのもいいでしょう。 一例です # 引数: shift_jisの文字列 # 戻り値:ISO-2022-JPに変換された文字列 sub jis{ my $msg = $_[0]; Encode::from_to($msg, "shiftjis", $charset); return $msg ; } # $_は便利なのですが、 # 注意して使わないと意図しないところで置き換わってしまいます foreach my $l ( split(/\n/, $body) ) { print MAIL &jis($l) . "\n"; } なお、base64にも同様の問題(グローバル変数 $strの使用) があります。

choei
質問者

お礼

大変ご丁寧な解説ありがとうございました。 ご解説頂いてから、内容を自分なりに噛み砕き、きちんと理解し全て解決するまでに時間がかかってしまったため、お礼も遅くなってしまいました。 以前base64や&jisは教えて頂いたりネットに載っていたものを、特に$_の使い方が非常に苦手なため(相変わらず$_とすべきところと$_[0]とすべきところがよく分かっていませんが)、内容を理解しないまま使用し、そのためreturnのスペルに間違いがあることすら気づかず自分の仕様にはどこかマッチしないんだと頭から決めつけておりました。 今回グローバル変数を必要以上に使わないことも非常に勉強になりました。 本当にありがとうございました。

関連するQ&A