スレッド表示 | フラット表示〕 全トピック 923 件中 433 番目 次≫ ≪前

メールの文字化けについて

created: 2005-06-06 19:22 | modified: 2005-06-14 00:40 | reply: 5

[2306] メールヘッダに2行追加

user: ゆうじ | created: 2005-06-08 12:19
WinXP SP2 + PHP 4.3.11、i18ライブラリが無いので
代わりに mb_convert_encoding で文字コード変換という環境で
次のコードを試したら、文字コードは "JIS" に変換されていましたが、
文字コードの検出が"JIS"とはならず、"EUC-JP"となりました。
どうもPHP内部で文字コード検出に失敗してる様です。
しかし 他のクライアントで正しく表示されることを考えると
Outlook 出文字化けする直接の原因ではないと思います。

テストコード
<?php
$str = 'みなさんこんにちは';
$str = mb_convert_encoding($str, 'JIS', 'EUC-JP');

echo mb_detect_encoding($str), ' : ', $str;
?>

出力
EUC-JP : みなさんこんにちは


ブラウザで、JISコードの文字列を強制的に EUC として表示すると
お知らせ頂いたように、"$" と "英数記号" だらけの文字が表示されますし
エンコードも EUC として検出されます。
Outlook でも同じように文字コードの検出に失敗しているのだと思われます。


■ 対策
いろんなメールのヘッダを確認してみるとわかりますが、
日本語を含むテキストメールのヘッダには次の2行が必ずあるはずですが
これが無い為に文字コードの検出に失敗してるのだと思います。

Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit


mb_send_mail 関数では、文字コードの変換も行ってくれますし
このヘッダも自動的に追加してくれますので、
可能なら mb_send_mail で送信すると良いと思います。

<?php
$message = 'みなさんこんにちは';

$to = 'php@sound-uz.jp';
$subject = 'Test';
$header = "From: php@sound-uz.jp";

mb_language('Japanese'); // 日本語メールの際は必須

mb_send_mail($to, $subject, $message, $header);
?>


もし どうしても mail 関数でということなら、
第4引数の追加ヘッダに自前で書き加えれば同じ効果が得られます。

<?php
$message = 'みなさんこんにちは';
$message = mb_convert_encoding($message, 'JIS', 'EUC-JP');

$to = 'php@sound-uz.jp';
$subject = 'Test';
$header = "From: php@sound-uz.jp\r\n";
$header .= "Content-Type: text/plain; charset=ISO-2022-JP\r\n";
$header .= "Content-Transfer-Encoding: 7bit";

mail($to, $subject, $message, $header);
?>
Parent: 2305  reply: 2308 返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 923 件中 433 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑