[PHP-users 33318] Re: (手がかり有り)この文字化けの対処方法をご提案願います。

kj tribute0404 @ yahoo.co.jp
2008年 2月 21日 (木) 17:55:51 JST


sublime様、あさかわ様、goungoun様

お世話になっております。門戸(kj)です。

>なぜならば、mysqlのSET NAMESは
>クライアント(この場合PHP)の、期待するコード(この場合 
>EUC-JP)を指定するためのものです。

大変失礼致しました。MySQLとやりとりするコードを
PHPのコードであるEUC-JPにするのが目的なのに、
意味をよく調べないまま、MySQLのデフォルト文字セットを
セットしていました。。。

ということは私のソース(EUC-JP)はそこを直しますと、

$enc_disp = "EUC-JP";
$enc_db = "EUC-JP";

(中略:DB接続)

$sql = "SET NAMES ujis";//★utf-8から修正
$res = mysql_query($sql);

$sql = "INSERT INTO〜(中略)";
$res = mysql_query(mb_convert_encoding($sql, "UTF-8","EUC-JP"), $conn) or
die("
失敗");
↓
$res = mysql_query($sql, $conn) or die("失敗");

と、最後の行もmb_convert_encodingでutf-8にするのは
必要なくなるという理解でよろしいでしょうか。


・PHPスクリプトのソースの文字コードは?
・internal_encodingは?
・HTMLの文字コードは?(PHPからの出力)
・PHPスクリプトがPOST,GETで受け取る文字コードは?(PHPの入力)
・データベースの文字コードは?
・メールの文字コード(エンコード)は?

⇒まずはこれらをきちんと押さえます。


さらにsublimeさまのアドバイスにもありましたとおりテストを行っていると、
メールの件名(日本語、直打ち固定文字列)が
mail関数だと文字化けせず、mb_send_mailですと文字化けする
症状にはまってしまいました。

色々調べて試してみたのですが、mail関数でしかうまくいきません。
しかしこのままですと、理解していないまま「たまたま」
うまくいっている状態になってしまいますので、
原因をご相談させて頂けたらと思います。

(ソース)
	$from="(省略)";
	$to="(省略)";//EUC-JPのHTMLからPOSTされる。
	$subject="「○○診断」エントリー完了のお知らせです。";

	//元のエンコーディングを保存※1
	//$orgEncoding = mb_internal_encoding();
	//変換したい文字列のエンコーディングをセット※1
	//mb_internal_encoding("ISO-2022-JP");

	$subject=mb_encode_mimeheader($subject, "ISO-2022-JP","B","\n");

	//保存しておいたエンコーディングに戻す※1
	//mb_internal_encoding($orgEncoding);
	
	$headers  = "From:$from\n";
	$headers .= "MIME-Version: 1.0\n";
	$headers .= "Content-Type: text/plain; charset=iso-2022-jp\n";
	$headers .= "Content-Transfer-Encoding: 7bit\n";
	$headers .= "X-Mailer: PHPWebMailer\n";

	$contents="ここにメール本文が来ます。";
	$message = mb_convert_encoding($contents, "ISO-2022-JP", "EUC-JP");
	
	//メール送信★mb_send_mailだとSubject(メール件名)のみ文字化け…
	mail($to,  $subject, $message, $headers);

以上です。

(補足)
・コメントアウトしている「※1」×3行は、
 「mb_encode_mimeheaderを使う時はこれが必要」と書いてある
 サイトを見つけましたので、それに従ってみましたが、
 やっても文字化けは起こりました。

・smtpログは見てみましたが、
 今回の「件名のみが文字化けする」という痕跡は
 残っていないように思えます。(メールは無事届くからです。)

日本語の件名なので、できればたまたまうまくいっている
mailよりは、きちんと何かを設定してmb_send_mailで
完成させた方がいいのではと思っているのですが、
もし何かご意見などございましたら、お知恵を貸して頂けると嬉しいです。

門戸kj

--------------------------------------
Easy + Joy + Powerful = Yahoo! Bookmarks x Toolbar
http://pr.mail.yahoo.co.jp/toolbar/


PHP-users メーリングリストの案内