2年間運用しているサイトで、コンタクトフォームから送信されるメールに文字化けが発生しているのに気がつきました。WordPressで作成したサイトではなく、メール送信プログラムもPHPで作成したものです。
文字化けが発生する単語は、「本当」「本田」でした。それ以外の単語もあるのかも知れませんが確認できていません。レンタルサーバーは「お名前ドットコム」のRSプランです。
このときお名前ドットコムに問い合わせて教えてもらった解決した方法を記載します。
もし、同じトラブルが発生した方は、一度試してみてください。
今回のトラブルについて
現象
文字化けが発生する単語:「本当」「本田」
「本来」「本日」「本格的」「本部」などは正常でしたので、「本」を使用すると、現象が発生するということではないようです。
送信プログラムについて
当該サイトは、WordPressなどのCMSを使用して作成したサイトではありません。また、コンタクトフォームの送信プログラムもPHPで作成したものです。以下、詳細です。
・PHPのバージョンは、7.4および8.0
・php.iniの設置なし
・PHPファイルはUTF-8で保存
・文字コード指定は以下のとおり
mb_language( "ja" );
mb_internal_encoding( "UTF-8" );
・送信はmb_send_mail関数を使用。ただし、mail関数を使用したプログラムでも同様の現象が発生
・同じプログラムをエックスサーバー上で実行すれば、文字化けなく正常にフォームの送信が行える
文字化け発生のきっかけ
きっかけは、お名前ドットコムのサーバープランをSDプランからRSプランに変えたため、サーバーが新サーバー移行されたことではないかと考えています。2、3か月前までSDプランのサーバーでこのコンタクトフォームを運用しており「本田」という文字も入力していた「はず」 ※ ですが、文字化けはありませんでした。
※残念ながらテストデータを削除してしまったため、エビデンスがありません。しかしある理由からかなりの確率で「本田」と入力しています。
考えられる原因
お名前ドットコムで新サーバーに移行する前は文字化けはなかったであろうこと、エックスサーバーで実行すれば問題なくフォームの送信が行えることから、お名前ドットコムの新サーバーの仕様ということかも知れません。
解決方法
mb_languageの「ja」指定を「neutral」に変更する。
mb_language( "neutral" );
なぜmb_language が「ja」だと文字化けなのか、なぜ古いサーバーや他社サーバーだと問題ないのか、調べてみたのですがわかりませんでした。
サポートセンターにも問い合わせたのですが、1件質問を投げるたびに返信が戻るまで数日かかるうえ、やっと帰ってきた回答も核心を突いた言及がありません。時間のかかるやり取りに根負けしてしまい、結局、明確な原因はわからないままです。もしかしたら、レアな条件が重なった時だけにおきるケースでサポートセンターも究明できていないのかも知れません。
まとめ
この記事のまとめです。
- お名前ドットコム上で動かしているPHPのメール送信プログラムで文字化けが発生する場合、mb_language( “neutral” );を試してみてください。
レアケースかも知れませんが、同様のトラブルに見舞われた方、何をしても文字化けになってしまう方は、この方法で解決するかも知れません。