PHPでJIS以外の文字(例:①②③)を文字化けせずに日本語メールを送る方法

mb_internal_encoding(“UTF-8”);
mail(
‘dummy@aainc.co.jp’,
mb_encode_mimeheader(‘テスト’, ‘ISO-2022-JP-MS’), //エンコードはISO-2022-JP-MSで
mb_convert_encoding(‘①②③’, ‘ISO-2022-JP-MS’), //エンコードはISO-2022-JP-MSで
“Content-Type: text/html; charset=\”ISO-2022-JP\”;\n” //ヘッダはISO-2022-JPを指定
);

jisとiso-2022-jpの違い

mb_convert_encoding関数においてiso-2022-jpとjisでは意味が違うらしい。

結論から言うとiso-2022-jpは半角カナに対応しておらずjisは対応している。
だからmb_convert_encoding($str,”jis”)と書くほうが無難。

さらにmb_encode_mimeheaderでエンコードするときもmb_encode_mimeheader($str,”jis”)と書いてあげないと半角カナが化ける結果になる。
これに気づかないとメール送信などではまる

検証

// 半角カナが無いエンコードでは同じ結果
echo base64_encode(mb_convert_encoding(“漢字ひらがなカタカナ”,“iso-2022-jp”));
// GyRCNEE7eiRSJGkkLCRKJSslPyUrJUobKEI=

echo base64_encode(mb_convert_encoding(“漢字ひらがなカタカナ”,“jis”));
// GyRCNEE7eiRSJGkkLCRKJSslPyUrJUobKEI=

// 半角カナがあるエンコードでは違う結果
echo base64_encode(mb_convert_encoding(“漢字ひらがなカタカナハンカク”,“iso-2022-jp”));
// GyRCNEE7eiRSJGkkLCRKJSslPyUrJUobKEI/Pz8/

echo base64_encode(mb_convert_encoding(“漢字ひらがなカタカナハンカク”,“jis”));
// GyRCNEE7eiRSJGkkLCRKJSslPyUrJUobKElKXTY4GyhC

// 逆の処理をするとiso-2022-jpは化ける
echo mb_convert_encoding(base64_decode(“GyRCNEE7eiRSJGkkLCRKJSslPyUrJUobKEI/Pz8/”),“utf-8”,“iso-2022-jp”);
// 漢字ひらがなカタカナ????

echo mb_convert_encoding(base64_decode(“GyRCNEE7eiRSJGkkLCRKJSslPyUrJUobKElKXTY4GyhC”),“utf-8”,“jis”);
// 漢字ひらがなカタカナハンカク

// jisにエンコードたものをiso-2022-jpからデコードすると化けない
echo mb_convert_encoding(base64_decode(“GyRCNEE7eiRSJGkkLCRKJSslPyUrJUobKElKXTY4GyhC”),“utf-8”,“iso-2022-jp”);
// 漢字ひらがなカタカナハンカク

そもそもiso-2022-jpとは

JIS規格によって規定されている日本語の文字コードの一つ。
iso-2022-jpは7ビットで表現されているため、欧米などで開発された8ビット目を無視する電子メールシステムでも問題なく使用することができる。
このため、電子メールでの日本語送受信はiso-2022-jpによって行うことが事実上の標準となっている。

DETAILS

http://www.systemexpress.co.jp/php/iso-2022-jp.html