CGI-BBS > SO−HO > ショッピングバスケット > ショッピングバスケットv7で注文確認のメール一部文字化けする


カレッヂ
カレッヂ


質問者 うえさん  投稿日 4/20(日) 02:40:35
動作自体は問題なくしております。が、注文確認メールを受信しますと、
<計算書>から後ろの全角が文字化けしてしまいます。
エンコードを「MacOS」にすると化けていた部分は正常表示になりますが
今度は正常だった部分が「化け」てしまいます。
メーラーは OS-Xの Mail です
******************************
<ご発送先>

うえさん 様
*******
新潟県 南魚沼郡六日町
******

<計算書>

&#143;&#164;&#149;i&#147;_&#144;&#148;              54
&#143;&#172;&#140;v          163,780 &#137;~

*******************************
商品を54個、合計金額163780円です。

&#136;&#200;&#143;&#227; - 2003/04/20-SUN-01:28:45

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:MacX
エディタ:jedit
FTPソフト:fetch
サーバ移転:していない
改造:していない
CGI習熟度:middle

回答者 BEAR  [削除]  投稿日 5/9(金) 22:21:44
あいにく解決策はわかりませんが、当方も同様の症状です。
Entourageの場合は、
「このメッセージには、お使いのコンピュータで表示できない言語を使用したテキストが含まれています」
となってしまい、全く表示できないか、すべて文字化けしてしまいます。
どこかに不要なコントロールコードでも残っているのではないかと思いますが、検証していません。
回答者 呑兵衛@大阪  [削除]  投稿日 5/11(日) 18:05:50
cart1.cgi 84 行目と 146 行目
print OUT &jis("\n<計算書>\n\n");
#これを追加
$ORDER2 = &jis($ORDER2);

(@OUT) = split(/\n/,$ORDER2);


print OUT "$CSV\n\n";
を
print OUT &jis("$CSV\n\n");

print OUT "送信者情報: $host\n";
を
print OUT &jis("送信者情報: $host\n");

print OUT "\n以上 - $date_now\n\n"; 2行あります
を
print OUT &jis("\n以上 - $date_now\n\n");
回答者 BEAR  [削除]  投稿日 5/13(火) 15:07:52
呑兵衛@大阪 様

アドバイスありがとうございます。

あいにく、

$ORDER2 = &jis($ORDER2);

の部分だけ解消しません。切り分けた文字列に対して処理すればよいのかと思いましたが、
あいにく知識不足でうまくいきませんでした。
回答者 呑兵衛@大阪  [削除]  投稿日 5/13(火) 19:56:59
> 解消しません。
そちらにはわかっているのでしょうが、こちらはさっぱり事態が理解できませんです。

ほんじゃぁ
foreach (@OUT) {
    $_ = &jis(&_);
    ($p1,$p2) = split(/\0/,$_,2);
または
foreach (@OUT) {
    ($p1,$p2) = split(/\0/,$_,2);
    $p1 = &jis($p1); $p2 = &jis($p2);

ついでに
init.cgi 50行目
format OUT =
@<<<<<<<< @>>>>>>>>>>>>>
$p1,$p2
を
スカラーを@の下に合わせ(全角空白使わないこと)
format OUT =
@<<<<<<<< @>>>>>>>>>>>>>
$p1,      $p2
回答者 BEAR  [削除]  投稿日 5/14(水) 10:54:16
いえいえ、わかっていれば自分で解決しますよ(笑)。情報不足でした、すみません。
Windowsなどであれば、どのメーラーでも問題ないのでしょうかね。
私の予測ははずれていたようで、現状完全にお手上げです。

** $ORDER2 = &jis($ORDER2); の場合
入れない場合と同様の結果。Shift JISにすれば正常表示。
<計算書>

???i?_??               1

?¬?v           30,300 ?~
?A´?i¨?Å          1,515 ?~
????              640 ?~
???v           32,455 ?~

以上 - 2003/05/14-WED-10:34:14


** $_ = &jis(&_); の場合

ここで停止しているようで、出力されず。写しは送信されない。


** $p1 = &jis($p1); $p2 = &jis($p2); の場合
別の文字に化ける。Shift JISにしても同じ表示のまま。
<計算書>

 $B>&IJE@              1

 $B>.7W ( 30,300  $B1_ (
 $B>CHq@G 1,515  $B1_ (B
 $BAwNA (   640  $B1_ (B
 $B9g7W ( 32,455  $B1_ (

以上 - 2003/05/14-WED-10:44:02
回答者 呑兵衛@大阪  [削除]  投稿日 5/14(水) 14:35:10
ひょっとすると、ですが、、
jcode.pl のバージョンを確認してください。もしアーカイブに入っているものをそのまま
使っておられるのなら、最も新しい ver 2.13 に変更して当初のスクリプトで再挑戦してください。
回答者 BEAR  [削除]  投稿日 5/15(木) 11:48:44
残念ながらだめでした。
v2.13に変更して、
7.02オリジナルと、前回のコード変更と試してみましたが、状況に変化ありません。

サーバー側の問題かとも思いましたが、rescueさんのサンプルページも同様ですね。
回答者 呑兵衛@大阪  [削除]  投稿日 5/16(金) 22:04:57
NetscapeMail, Eudora 5.1 で受信を確認しました。文字化けはありません。
Outlook Express 5 では <計算書>以前で文字化けが見られます。
今のところ cargo7.00 から送信されたメールの文字化けは Microsoft製のソフトに見られます。
他のショッピングバスケットプログラムからのメールには文字化けが発生していませんので、
何らかの因果関係があるかもしれません。
原因が分かりましたらどこかで発表します。
回答者 呑兵衛@大阪  [削除]  投稿日 5/18(日) 12:37:07
1.Microsoft製MAC版メーラーには、メール本文に異なる文字コードがある場合、
  強制的にJISコード変換しない機能になっているようです。(あるいは未対応)
2.format コマンドが受取るfilehandleは、ブラウザから入力された文字コード
  そのものを返すため、コード変換ルーチンをかましても効果がない。
3.これらによって、メール本文にはJISコード、Shift_Jisコードが混在するこ
  とになり、Microsoft社製MAC版メーラーは一部のコード変換をしないまま、
  画面上に生データを再現する。
4.対策
  format コマンドで出力される部分を一時ファイルに格納し、そのファイルを
  再び読み込み、その時点でコード変換しメールに出力する。

init.cgi 50行目
format OUT =
を
format DATA =
に

cart1.cgi 35行目あたり
open(OUT,"| $sendmail -t");
の直前で
open (DATA, "> temp.$$") || &error('Error');
(@OUTPUT_DATA) = split(/\n/,$ORDER2);
foreach (@OUTPUT_DATA) {
    ($p1,$p2) = split(/\0/,$_,2);
    write DATA;
}
close (DATA);
open (DATA, "temp.$$") || &error('Error');
while (<DATA>) { $data_lines .= $_; }
close (DATA);
を追記
その後
print OUT "\n<計算書>\n\n";
以降を
print OUT &jis("\n<計算書>\n\n");
print OUT &jis($data_lines);
if ($in{'CARD'}) { print OUT &jis("\nクレジットカード決済希望者\n\n"); }
print OUT &jis("\n以上 - $date_now\n\n");
print OUT &jis("$CSV\n\n");
print OUT &jis("送信者情報: $host\n");
とし
購入者宛てメール送信ルーチンも
print OUT &jis("\n<計算書>\n\n");
print OUT &jis($data_lines);
if ($in{'CARD'}) { print OUT &jis("\nクレジットカード決済希望\n\n"); }
print OUT &jis("\n以上 - $date_now\n");
close(OUT);
unlink "temp.$$";
に変更する。
回答者 BEAR  [削除]  投稿日 5/18(日) 14:08:50
OSXのMailおよびEntourageでも正常動作を確認しました。
対策案の提示並びに詳細な説明をありがとうございました。

文字コードが混在しているとすれば、すべてのメーラーが対応していなくとも
不思議ではないですね。
回答者 rescue  [削除]  投稿日 6/5(木) 20:40:30
いつもお世話になっております。
MACでの不具合が掲示板に報告されているということを教えてもらい拝見しました。
既に呑兵衛さんのアドヴァイスで解決されたとのこと、呑兵衛さんもいつも
ありがとうございます。ファイル出力しないでメモリを使う方法なども
考えてみたのですが、formatコマンドがそのような動作をするということは
今回勉強させていただきました。或いは、nkf -j を使ってパイプすれば
問題なかったのかもしれませんが、nkfがインストールされていないサーバもあり、
面倒でもjcode.plでやってしまわなければならないのですが、
たまたま私の環境では影響が出なかったようです。MACでのその症状というものを
私も体験できないので、呑兵衛さんの方法で組みなおして対応したいと思います。

返信(回答)する

 


Web裏技