![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
CGIメールです。
元々shiftjisなので、これをiso-2022-jpに変換させようとしてます。
$charset = "iso-2022-jp";
open(MAIL,"| $sendmail -t") || &error("失敗");
print MAIL "To: <$to>\n";
print MAIL "From: <$from>\n";
&jis("タイトル"); &base64("$msg"); print MAIL "Subject: $str\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=$charset\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
foreach ( split(/\n/, $body) ) {
&jis("$_");
print MAIL $_, "\n";
}
close(MAIL);
sub jis{
$msg = $_[0];
Encode::from_to($msg, "shiftjis", $charset);
####1####
}
sub base64 {
use MIME::Base64;
$str = $_[0];
if($str =~ /[^!-~\s]/){
$str = encode_base64($str, "");
if($charset eq "utf8"){
$str = '=?utf-8?B?' . $str . '?=';
}else{
$str = '=?iso-2022-jp?B?' . $str . '?=';
}
}
}
このようにしてみたのですが、タイトル部分はきちんと表示されるのですが、ボディー部分が文字化けしてしまいます。(メーラーで手動にてshit-jisにエンコードしたらボディー部分が読めタイトル部分は文字化けする)
Encode::from_to($msg, "shiftjis", $charset);
の$charsetを"$charset"にしても同じ現象です
また、元々参考にしたものでは####1####に
retern $msg;
があったのですが、これを入れるとsyntax errorになったので、これをコメントアウトしたらエラーにはならず送信そのものはできました
ただ目的の文字変換ができないのですが、どこをどう改善すればいいでしょうか。
どうかご存じの方ぜひ教えてください。
よろしくお願いします。
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の使用) があります。
大変ご丁寧な解説ありがとうございました。
ご解説頂いてから、内容を自分なりに噛み砕き、きちんと理解し全て解決するまでに時間がかかってしまったため、お礼も遅くなってしまいました。
以前base64や&jisは教えて頂いたりネットに載っていたものを、特に$_の使い方が非常に苦手なため(相変わらず$_とすべきところと$_[0]とすべきところがよく分かっていませんが)、内容を理解しないまま使用し、そのためreturnのスペルに間違いがあることすら気づかず自分の仕様にはどこかマッチしないんだと頭から決めつけておりました。
今回グローバル変数を必要以上に使わないことも非常に勉強になりました。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- PHP Content-Typeが機能していない? 2 2022/07/17 11:10
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【至急!!!】python言語で本を見...
-
UWSCのSELECT文の記述方法
-
16進の10進変換について
-
c言語 16進数の2進数への変換
-
関数「exists」と「defined」の...
-
DBIがうんともすんとも言いませ...
-
$(ドル)の記号を表示したいの...
-
数値かどうかの判定方法
-
Perlにおける<?phpinfo();?>の...
-
Use of uninitialized value ---
-
pythonで演算子を変数に代入す...
-
掲示板からのメールの本文中に...
-
Python3
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
メモリをアドレスを直接指定し...
-
SELECT OPTIONの中身をコピペ...
-
FindFirst を複数条件で検索
-
構造体の各データの表示につい...
-
文字の横にプルダウンを表示さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
【至急!!!】python言語で本を見...
-
pythonで演算子を変数に代入す...
-
数値かどうかの判定方法
-
pythonの*
-
UWSCのSELECT文の記述方法
-
int(input("○○"))の使い方
-
関数「exists」と「defined」の...
-
c言語 16進数の2進数への変換
-
Perlにおける<?phpinfo();?>の...
-
シェルスクリプトで、空白(ス...
-
I2C接続のLCDディスプレイを使う
-
「HSP」でキャラコードを使って...
-
switch文のエラーについて
-
Use of uninitialized value ---
-
変数の中は文字列か数値か調べ...
-
perでメールが送信出来ない場合...
-
画面上再読み込みをさせたいの...
-
awkの正規表現での最左最短マッ...
-
数値英単語変換
おすすめ情報