HPでPHP3のmail()を使って利用者にmailを出しているのですが、
かなりの頻度で文字化けしてしまっています。
コンピュータ同士の相性の問題なのでしょうか?
それともプログラムに不備(あるいはこうすれば解消する)
があるのでしょうか。
是非是非とも御教授のほどお願いいたします。
OSはUNIX(Irixv6.5.1)でwebサーバはAppach、phpは4でなく3(そのためnkfでエンコードしてます)、文字コードはEUCでUPしています。

$to="(formで入力された利用者のアドレス)";
$subject="(固定)";
$body="(formで利用者が入力されたものあり)";
$header="Content-Type: Text/Plain;charset=iso-2022-jp\nFrom: office@○○○×××.com\n";
$pp=popen("echo '$subject' | /usr/local/bin/nkf -j","r");
while(!feof($pp)){
$jis_sub=$jis_sub.fgets($pp,1024);
}
$base64_sub=base64_encode($jis_sub);
$mime_sub="=?ISO-2022-JP?B?".$base64_sub."=?=";

$pp=popen("echo '$body' | /usr/local/bin/nkf -j","r");
while(!feof($pp)){
$jis_body=$jis_body.fgets($pp,1024);
}
mail($to,$mime_sub,$jis_body,$header);

このQ&Aに関連する最新のQ&A

Office head」に関するQ&A: Head office

A 回答 (5件)

> 半角カナや機種依存文字でなくても化けて


だとすると、これはnkfが入力文字列の漢字コード判定を失敗している可能性はありませんか?
nkfの入力文字をEUCに決め打ち(-Eオプション)にするとどうでしょうか?

送信元<form>ファイルに
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">
が書かれていれば、ほとんどの場合EUCでpostされるはずです。(たまに例外もあるようです)

レンタル屋さんに「php4.0.6以降にしてくれ」とは言えないんでしょうね、、、
    • good
    • 0
この回答へのお礼

いろいろ有難うございます。
(-Eオプション)で上手く行くような気がします。多分。きっと。
*ちなみに
 $pp=popen("echo '$subject' | /usr/local/bin/nkf -j -E","r");
 でいいんですよね?
 色々Webで調べたのですがよくわからず多分こうだろうと…

とりあえず設置してみて様子をみます!
ホントに有難うございました!

お礼日時:2001/11/15 18:06

すでに解決されているかもしれませんが・・・。



初めの方がおっしゃっているように、$body 変数の文字コードが統一されていない可能性があります。
$body の文字列を form 入力値から生成する際に、form 入力値などを適切に EUC に変換する必要があるのではないでしょうか?
    • good
    • 0
この回答へのお礼

アドバイス有難うゴザイマス。
何分どしろうとなもので、文字コードが不統一だとか、nkfは自動識別だとか(よく考えれば何も入力に指定しないので当たり前なのですが)、formの文字コードは単純に<META>指定とは限らないだとか、全部意識せず突っ走ってきました、ここでいろいろ初めて知り、勉強になりました。
ホント有難うゴザイマス!

お礼日時:2001/11/15 18:14

> $body="(formで利用者が入力されたものあり)";


とありますので、form からの入力とハードコーディングされた文字列と混在しているのでしょうか?

であれば、複数の文字コードで構成された文字列ということになるでしょうから、nkf では化けると思います。

また、国際化されていない php であれば、下記 URL の jcode.phps がかなり有効ではないでしょうか。
php 4 以上であれば、納得のいく速度だと思います。

ここからはほとんどチャチャですが。。。
あと、selenity さんがおっしゃっていますが、送信される form の内容は form の文字コードで送信される「わけでは」ありません。
ただ、歴史的な経緯でそうなっているだけのようです。
最近では、送信される文字コードは全て UTF-8 にしようという動きもあるそうですので。。。
ただし、現時点ではかなりの確率で form の文字コードで送信されます。

また、php を使用されているのであれば、header 関数を用いて、
header("Content-type: text/html; charset=EUC-JP");
としたほうが、META より効くはずです。

すいません。チャチャでしたね。。。

参考URL:http://www.spencernetwork.org/
    • good
    • 0
この回答へのお礼

ご返事遅れてすみません。
いろいろお教えいただいて有難うゴザイマス。
とりあえずselenity さんに教えていただいた-Eオプションで
様子を見てみます。
header("Content-type: text/html; charset=EUC-JP");
の件やformの文字の送られるコードなど、全然知りませんでした。
めっちゃくちゃ為になりました。有難うゴザイマス!

お礼日時:2001/11/15 18:10

本文内の半角カナや機種依存文字の処理は大丈夫ですか?



何かしらの制約でphp-i18n版を使えないのでしょうか?

もし、可能であれば「php-3.0.18-i18n-jp2」を使えば、文字コード関連処理の手間がずいぶんと省けますよ。
またはphp4.0.6以降では、i18n系が統合されていますので、php3-i18n版とほぼ同等のi18n関連処理が可能です。
    • good
    • 0
この回答へのお礼

回答有難うございます。

半角カナや機種依存文字でなくても化けてしまうのです。トホホ
(全てDBにインプットしてるのでその文字はわかってます。)
ちなみに何がしか半角カナや機種依存文字をはじく方法というのはあるのでしょうか?
もしありましたら是非お教えください。

HPはレンタルで借りていて、そこにインストールされているものを使うしかなく、
自分でどうにもできません。いわゆる国際化対応バージョンでないので、こうした処理をしています。そのレンタル屋さんに何とか国際化して欲しいのですが…

お礼日時:2001/11/13 20:18

メールの基本はJISではないですか?


EUCでも良いのでしょうか?
    • good
    • 0
この回答へのお礼

EUCをメール用にJISに変換してます。
その過程で上手くいってないことは確かなのですが…
しかし、日本語の文字コードは誰か何とかして欲しいですよね。

お礼日時:2001/11/13 20:09

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

このQ&Aと関連する良く見られている質問

Q$str=preg_replace('/\u3000/','  ',$str);

によってutf-8の空白文字をhtmlの空白文字に変換しようとしたのですがエラーになります
どうしたらいいのでしょうか?

Aベストアンサー

>そもそも?のところにコード表現で空白文字を入力する手段はないのでしょうか?
\xE3\x80\x80
で一応いいかと思いますが…

Qループ forに関して for($i = $num ; $i < $max ; $i++)

phpの初心者です。

以下の記述ですが、上手にループしてくれません。

for($i = $num ; $i < $max ; $i++)

$num の部分に「0」を入れると稼動するのですが、変数を代入したいというのが希望です。

方法があったらご教授下さい。

Aベストアンサー

もう一度全体のコードを見直してみてください。
問題なく動作します。

$num = 1;
$max = 5;

for($i = $num ; $i < $max ; $i++){
echo $i."<br />";
}

Q$str=mb_ereg_replace('goo','グッド',$str);

によって
$strの中の'good'を'グッド'に変更したいのですが
'good'は大文字と小文字を区別しないようにしたいのですがどうしたらいいでしょうか?
例えば
'goOd'も'グッド'にしたいのです。
PHPマニュアルには詳しい使い方が載っていないので困っています。

Aベストアンサー

大文字小文字を無視するなら
mb_eregi_replace
では?

参考URL:http://jp2.php.net/manual/ja/function.mb-eregi-replace.php

Q$ka = $_REQUEST[\"FFF\"];が変数に代入できなくて困ってます┐(´~`;)┌

今任意の名前でファイルを生成するPHPを作っています。ファイルの中身に$ka = $_REQUEST[\"FFF\"];というコードをファイル作成時に書き込みたいんですが、どうも変数 $HTMLにうまく代入されてくれません。もし、どこが問題なのかわかる方どなたかいらっしゃいましたらアドバイスお願いしますΣo(≧~≦)o。


下にコードを書いておきます。


<form name="form" action="A.php" method="POST">
HTMLファイルの名前
<input name="DAI" type="text">
<input type="submit" value="作成">
</form>
<?php
$DAI = $_REQUEST["DAI"];
?>





<!-- 【この下のコード$ka = $_REQUEST[\"FFF\"];がうまく変数$HTMLに代入されません】 -->
<? $HTML="$ka = $_REQUEST[\"FFF\"];" ?>





<?php
$fp = fopen("$DAI.php","a");
fputs($fp,$HTML);
fclose($fp);
echo "ファイル作成成功!";
?>
<?
print"$DAIが作成されました";
?>
<?
print"<A href=\"http://localhost/$DAI.php\">作成された貴方のファイルへのリンク</A>";
?>

今任意の名前でファイルを生成するPHPを作っています。ファイルの中身に$ka = $_REQUEST[\"FFF\"];というコードをファイル作成時に書き込みたいんですが、どうも変数 $HTMLにうまく代入されてくれません。もし、どこが問題なのかわかる方どなたかいらっしゃいましたらアドバイスお願いしますΣo(≧~≦)o。


下にコードを書いておきます。


<form name="form" action="A.php" method="POST">
HTMLファイルの名前
<input name="DAI" type="text">
<input type="submit" value="作成">
</form>
<?p...続きを読む

Aベストアンサー

<? $HTML='$ka = $_REQUEST["FFF"];' ?>
こういうことでしょうか?

シングルクォートは変数を評価しません。

Qif (isset($_POST["body"]) && $_POST

if (isset($_POST["body"]) && $_POST["body"])の中の&& $_POST["body"]って必要ですか?
PHPのプログラムを読んでいて、以下のような部分を見つけました
if (isset($_POST["body"]) && $_POST["body"])

しかし、どうせisset($_POST["body"])でnullかどうか、値が入っているかどうかを確めているので、&& $_POST["body"]の部分は必要ないように思います。なぜこのような書き方をしているのでしょうか?

Aベストアンサー

 isset($_POST["body"])では値が入っているかどうかを調べていますが、値が何であるかは問いません。その値を判定しているのが二つ目の式です。
 PHPの論理判定では値が0の時に偽になり、それ以外の時は真になります。つまり、$_POST["body"]の値が0かどうかを判定しています。($_POST["body"] != 0)と同じです。

 判定式全体では、$_POST["body"]に0以外の値が入っている時に真になり、値が入っていないか0の時に偽になります。


このカテゴリの人気Q&Aランキング

おすすめ情報